Lines Matching +full:rx +full:- +full:watermark
1 // SPDX-License-Identifier: GPL-2.0+
11 #include <linux/dma-mapping.h>
29 #define DRIVER_NAME "imx-lpi2c"
31 #define LPI2C_PARAM 0x04 /* i2c RX/TX FIFO size */
45 #define LPI2C_MRDR 0x70 /* i2c master RX data register */
192 (atomic ? readl_poll_timeout_atomic(lpi2c_imx->base + LPI2C_MSR, val, \
194 readl_poll_timeout(lpi2c_imx->base + LPI2C_MSR, val, cond, \
200 writel(enable, lpi2c_imx->base + LPI2C_MIER); in lpi2c_imx_intctrl()
213 writel(temp, lpi2c_imx->base + LPI2C_MSR); in lpi2c_imx_bus_busy()
214 return -EAGAIN; in lpi2c_imx_bus_busy()
219 dev_dbg(&lpi2c_imx->adapter.dev, "bus not work\n"); in lpi2c_imx_bus_busy()
220 if (lpi2c_imx->adapter.bus_recovery_info) in lpi2c_imx_bus_busy()
221 i2c_recover_bus(&lpi2c_imx->adapter); in lpi2c_imx_bus_busy()
222 return -ETIMEDOUT; in lpi2c_imx_bus_busy()
230 return readl(lpi2c_imx->base + LPI2C_MFSR) & 0xff; in lpi2c_imx_txfifo_cnt()
235 unsigned int bitrate = lpi2c_imx->bitrate; in lpi2c_imx_set_mode()
249 lpi2c_imx->mode = mode; in lpi2c_imx_set_mode()
257 temp = readl(lpi2c_imx->base + LPI2C_MCR); in lpi2c_imx_start()
259 writel(temp, lpi2c_imx->base + LPI2C_MCR); in lpi2c_imx_start()
260 writel(0x7f00, lpi2c_imx->base + LPI2C_MSR); in lpi2c_imx_start()
263 writel(temp, lpi2c_imx->base + LPI2C_MTDR); in lpi2c_imx_start()
273 writel(GEN_STOP << 8, lpi2c_imx->base + LPI2C_MTDR); in lpi2c_imx_stop()
278 dev_dbg(&lpi2c_imx->adapter.dev, "stop timeout\n"); in lpi2c_imx_stop()
279 if (lpi2c_imx->adapter.bus_recovery_info) in lpi2c_imx_stop()
280 i2c_recover_bus(&lpi2c_imx->adapter); in lpi2c_imx_stop()
294 clk_rate = lpi2c_imx->rate_per; in lpi2c_imx_config()
296 if (lpi2c_imx->mode == HS || lpi2c_imx->mode == ULTRA_FAST) in lpi2c_imx_config()
302 clk_cycle = clk_rate / ((1 << prescale) * lpi2c_imx->bitrate) in lpi2c_imx_config()
303 - 3 - (filt >> 1); in lpi2c_imx_config()
305 clklo = clk_cycle - clkhi; in lpi2c_imx_config()
311 return -EINVAL; in lpi2c_imx_config()
314 if (lpi2c_imx->mode == ULTRA_FAST) in lpi2c_imx_config()
320 if (lpi2c_imx->mode == ULTRA_FAST) in lpi2c_imx_config()
323 writel(temp, lpi2c_imx->base + LPI2C_MCFGR1); in lpi2c_imx_config()
327 writel(temp, lpi2c_imx->base + LPI2C_MCFGR2); in lpi2c_imx_config()
334 if (lpi2c_imx->mode == HS) in lpi2c_imx_config()
335 writel(temp, lpi2c_imx->base + LPI2C_MCCR1); in lpi2c_imx_config()
337 writel(temp, lpi2c_imx->base + LPI2C_MCCR0); in lpi2c_imx_config()
347 ret = pm_runtime_resume_and_get(lpi2c_imx->adapter.dev.parent); in lpi2c_imx_master_enable()
352 writel(temp, lpi2c_imx->base + LPI2C_MCR); in lpi2c_imx_master_enable()
353 writel(0, lpi2c_imx->base + LPI2C_MCR); in lpi2c_imx_master_enable()
359 temp = readl(lpi2c_imx->base + LPI2C_MCR); in lpi2c_imx_master_enable()
361 writel(temp, lpi2c_imx->base + LPI2C_MCR); in lpi2c_imx_master_enable()
366 pm_runtime_mark_last_busy(lpi2c_imx->adapter.dev.parent); in lpi2c_imx_master_enable()
367 pm_runtime_put_autosuspend(lpi2c_imx->adapter.dev.parent); in lpi2c_imx_master_enable()
376 temp = readl(lpi2c_imx->base + LPI2C_MCR); in lpi2c_imx_master_disable()
378 writel(temp, lpi2c_imx->base + LPI2C_MCR); in lpi2c_imx_master_disable()
380 pm_runtime_mark_last_busy(lpi2c_imx->adapter.dev.parent); in lpi2c_imx_master_disable()
381 pm_runtime_put_autosuspend(lpi2c_imx->adapter.dev.parent); in lpi2c_imx_master_disable()
390 time_left = wait_for_completion_timeout(&lpi2c_imx->complete, HZ); in lpi2c_imx_pio_msg_complete()
392 return time_left ? 0 : -ETIMEDOUT; in lpi2c_imx_pio_msg_complete()
404 dev_dbg(&lpi2c_imx->adapter.dev, "NDF detected\n"); in lpi2c_imx_txfifo_empty()
405 return -EIO; in lpi2c_imx_txfifo_empty()
409 dev_dbg(&lpi2c_imx->adapter.dev, "txfifo empty timeout\n"); in lpi2c_imx_txfifo_empty()
410 if (lpi2c_imx->adapter.bus_recovery_info) in lpi2c_imx_txfifo_empty()
411 i2c_recover_bus(&lpi2c_imx->adapter); in lpi2c_imx_txfifo_empty()
412 return -ETIMEDOUT; in lpi2c_imx_txfifo_empty()
420 writel(lpi2c_imx->txfifosize >> 1, lpi2c_imx->base + LPI2C_MFCR); in lpi2c_imx_set_tx_watermark()
427 remaining = lpi2c_imx->msglen - lpi2c_imx->delivered; in lpi2c_imx_set_rx_watermark()
429 if (remaining > (lpi2c_imx->rxfifosize >> 1)) in lpi2c_imx_set_rx_watermark()
430 temp = lpi2c_imx->rxfifosize >> 1; in lpi2c_imx_set_rx_watermark()
434 writel(temp << 16, lpi2c_imx->base + LPI2C_MFCR); in lpi2c_imx_set_rx_watermark()
441 txcnt = readl(lpi2c_imx->base + LPI2C_MFSR) & 0xff; in lpi2c_imx_write_txfifo()
443 while (txcnt < lpi2c_imx->txfifosize) { in lpi2c_imx_write_txfifo()
444 if (lpi2c_imx->delivered == lpi2c_imx->msglen) in lpi2c_imx_write_txfifo()
447 data = lpi2c_imx->tx_buf[lpi2c_imx->delivered++]; in lpi2c_imx_write_txfifo()
448 writel(data, lpi2c_imx->base + LPI2C_MTDR); in lpi2c_imx_write_txfifo()
452 if (lpi2c_imx->delivered < lpi2c_imx->msglen) { in lpi2c_imx_write_txfifo()
459 complete(&lpi2c_imx->complete); in lpi2c_imx_write_txfifo()
470 data = readl(lpi2c_imx->base + LPI2C_MRDR); in lpi2c_imx_read_rxfifo()
474 lpi2c_imx->rx_buf[lpi2c_imx->delivered++] = data & 0xff; in lpi2c_imx_read_rxfifo()
479 * data read. Add it to msgs->len. in lpi2c_imx_read_rxfifo()
481 if (lpi2c_imx->block_data) { in lpi2c_imx_read_rxfifo()
482 blocklen = lpi2c_imx->rx_buf[0]; in lpi2c_imx_read_rxfifo()
483 lpi2c_imx->msglen += blocklen; in lpi2c_imx_read_rxfifo()
486 remaining = lpi2c_imx->msglen - lpi2c_imx->delivered; in lpi2c_imx_read_rxfifo()
490 complete(&lpi2c_imx->complete); in lpi2c_imx_read_rxfifo()
494 /* not finished, still waiting for rx data */ in lpi2c_imx_read_rxfifo()
498 if (lpi2c_imx->block_data) { in lpi2c_imx_read_rxfifo()
499 lpi2c_imx->block_data = 0; in lpi2c_imx_read_rxfifo()
502 writel(temp, lpi2c_imx->base + LPI2C_MTDR); in lpi2c_imx_read_rxfifo()
503 } else if (!(lpi2c_imx->delivered & 0xff)) { in lpi2c_imx_read_rxfifo()
504 temp = (remaining > CHUNK_DATA ? CHUNK_DATA : remaining) - 1; in lpi2c_imx_read_rxfifo()
506 writel(temp, lpi2c_imx->base + LPI2C_MTDR); in lpi2c_imx_read_rxfifo()
518 lpi2c_imx->tx_buf = msgs->buf; in lpi2c_imx_write()
529 lpi2c_imx->tx_buf = msgs->buf; in lpi2c_imx_write_atomic()
536 return -EIO; in lpi2c_imx_write_atomic()
546 lpi2c_imx->rx_buf = msgs->buf; in lpi2c_imx_read_init()
547 lpi2c_imx->block_data = msgs->flags & I2C_M_RECV_LEN; in lpi2c_imx_read_init()
550 temp = msgs->len > CHUNK_DATA ? CHUNK_DATA - 1 : msgs->len - 1; in lpi2c_imx_read_init()
552 writel(temp, lpi2c_imx->base + LPI2C_MTDR); in lpi2c_imx_read_init()
559 rxcnt = (readl(lpi2c_imx->base + LPI2C_MFSR) >> 16) & 0xFF; in lpi2c_imx_read_chunk_atomic()
580 temp = readl(lpi2c_imx->base + LPI2C_MSR); in lpi2c_imx_read_atomic()
583 return -EIO; in lpi2c_imx_read_atomic()
586 tmo_us -= 100; in lpi2c_imx_read_atomic()
589 return -ETIMEDOUT; in lpi2c_imx_read_atomic()
594 if (!lpi2c_imx->can_use_dma) in is_use_dma()
601 return !(msg->len < I2C_DMA_THRESHOLD); in is_use_dma()
607 reinit_completion(&lpi2c_imx->complete); in lpi2c_imx_pio_xfer()
609 if (msg->flags & I2C_M_RD) { in lpi2c_imx_pio_xfer()
622 if (msg->flags & I2C_M_RD) { in lpi2c_imx_pio_xfer_atomic()
634 time = 8 * lpi2c_imx->dma->dma_len * 1000 / lpi2c_imx->bitrate; in lpi2c_imx_dma_timeout_calculate()
645 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_imx_alloc_rx_cmd_buf()
646 u16 rx_remain = dma->dma_len; in lpi2c_imx_alloc_rx_cmd_buf()
651 * Calculate the number of rx command words via the DMA TX channel in lpi2c_imx_alloc_rx_cmd_buf()
653 * the rx command words buffer. in lpi2c_imx_alloc_rx_cmd_buf()
656 dma->rx_cmd_buf = kcalloc(cmd_num, sizeof(u16), GFP_KERNEL); in lpi2c_imx_alloc_rx_cmd_buf()
657 dma->rx_cmd_buf_len = cmd_num * sizeof(u16); in lpi2c_imx_alloc_rx_cmd_buf()
659 if (!dma->rx_cmd_buf) { in lpi2c_imx_alloc_rx_cmd_buf()
660 dev_err(&lpi2c_imx->adapter.dev, "Alloc RX cmd buffer failed\n"); in lpi2c_imx_alloc_rx_cmd_buf()
661 return -ENOMEM; in lpi2c_imx_alloc_rx_cmd_buf()
665 temp = rx_remain > CHUNK_DATA ? CHUNK_DATA - 1 : rx_remain - 1; in lpi2c_imx_alloc_rx_cmd_buf()
667 rx_remain -= CHUNK_DATA; in lpi2c_imx_alloc_rx_cmd_buf()
668 dma->rx_cmd_buf[i] = temp; in lpi2c_imx_alloc_rx_cmd_buf()
679 time_left = wait_for_completion_timeout(&lpi2c_imx->complete, time); in lpi2c_imx_dma_msg_complete()
681 dev_err(&lpi2c_imx->adapter.dev, "I/O Error in DMA Data Transfer\n"); in lpi2c_imx_dma_msg_complete()
682 return -ETIMEDOUT; in lpi2c_imx_dma_msg_complete()
690 struct dma_chan *chan = dma->dma_data_dir == DMA_FROM_DEVICE in lpi2c_dma_unmap()
691 ? dma->chan_rx : dma->chan_tx; in lpi2c_dma_unmap()
693 dma_unmap_single(chan->device->dev, dma->dma_addr, in lpi2c_dma_unmap()
694 dma->dma_len, dma->dma_data_dir); in lpi2c_dma_unmap()
696 dma->dma_data_dir = DMA_NONE; in lpi2c_dma_unmap()
701 dmaengine_terminate_sync(dma->chan_tx); in lpi2c_cleanup_rx_cmd_dma()
702 dma_unmap_single(dma->chan_tx->device->dev, dma->dma_tx_addr, in lpi2c_cleanup_rx_cmd_dma()
703 dma->rx_cmd_buf_len, DMA_TO_DEVICE); in lpi2c_cleanup_rx_cmd_dma()
708 if (dma->dma_data_dir == DMA_FROM_DEVICE) in lpi2c_cleanup_dma()
709 dmaengine_terminate_sync(dma->chan_rx); in lpi2c_cleanup_dma()
710 else if (dma->dma_data_dir == DMA_TO_DEVICE) in lpi2c_cleanup_dma()
711 dmaengine_terminate_sync(dma->chan_tx); in lpi2c_cleanup_dma()
720 complete(&lpi2c_imx->complete); in lpi2c_dma_callback()
726 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_dma_rx_cmd_submit()
727 struct dma_chan *txchan = dma->chan_tx; in lpi2c_dma_rx_cmd_submit()
730 dma->dma_tx_addr = dma_map_single(txchan->device->dev, in lpi2c_dma_rx_cmd_submit()
731 dma->rx_cmd_buf, dma->rx_cmd_buf_len, in lpi2c_dma_rx_cmd_submit()
733 if (dma_mapping_error(txchan->device->dev, dma->dma_tx_addr)) { in lpi2c_dma_rx_cmd_submit()
734 dev_err(&lpi2c_imx->adapter.dev, "DMA map failed, use pio\n"); in lpi2c_dma_rx_cmd_submit()
735 return -EINVAL; in lpi2c_dma_rx_cmd_submit()
738 rx_cmd_desc = dmaengine_prep_slave_single(txchan, dma->dma_tx_addr, in lpi2c_dma_rx_cmd_submit()
739 dma->rx_cmd_buf_len, DMA_MEM_TO_DEV, in lpi2c_dma_rx_cmd_submit()
742 dev_err(&lpi2c_imx->adapter.dev, "DMA prep slave sg failed, use pio\n"); in lpi2c_dma_rx_cmd_submit()
748 dev_err(&lpi2c_imx->adapter.dev, "submitting DMA failed, use pio\n"); in lpi2c_dma_rx_cmd_submit()
757 dma_unmap_single(txchan->device->dev, dma->dma_tx_addr, in lpi2c_dma_rx_cmd_submit()
758 dma->rx_cmd_buf_len, DMA_TO_DEVICE); in lpi2c_dma_rx_cmd_submit()
759 return -EINVAL; in lpi2c_dma_rx_cmd_submit()
762 dma_unmap_single(txchan->device->dev, dma->dma_tx_addr, in lpi2c_dma_rx_cmd_submit()
763 dma->rx_cmd_buf_len, DMA_TO_DEVICE); in lpi2c_dma_rx_cmd_submit()
765 return -EINVAL; in lpi2c_dma_rx_cmd_submit()
770 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_dma_submit()
775 if (dma->dma_msg_flag & I2C_M_RD) { in lpi2c_dma_submit()
776 chan = dma->chan_rx; in lpi2c_dma_submit()
777 dma->dma_data_dir = DMA_FROM_DEVICE; in lpi2c_dma_submit()
778 dma->dma_transfer_dir = DMA_DEV_TO_MEM; in lpi2c_dma_submit()
780 chan = dma->chan_tx; in lpi2c_dma_submit()
781 dma->dma_data_dir = DMA_TO_DEVICE; in lpi2c_dma_submit()
782 dma->dma_transfer_dir = DMA_MEM_TO_DEV; in lpi2c_dma_submit()
785 dma->dma_addr = dma_map_single(chan->device->dev, in lpi2c_dma_submit()
786 dma->dma_buf, dma->dma_len, dma->dma_data_dir); in lpi2c_dma_submit()
787 if (dma_mapping_error(chan->device->dev, dma->dma_addr)) { in lpi2c_dma_submit()
788 dev_err(&lpi2c_imx->adapter.dev, "DMA map failed, use pio\n"); in lpi2c_dma_submit()
789 return -EINVAL; in lpi2c_dma_submit()
792 desc = dmaengine_prep_slave_single(chan, dma->dma_addr, in lpi2c_dma_submit()
793 dma->dma_len, dma->dma_transfer_dir, in lpi2c_dma_submit()
796 dev_err(&lpi2c_imx->adapter.dev, "DMA prep slave sg failed, use pio\n"); in lpi2c_dma_submit()
800 reinit_completion(&lpi2c_imx->complete); in lpi2c_dma_submit()
801 desc->callback = lpi2c_dma_callback; in lpi2c_dma_submit()
802 desc->callback_param = lpi2c_imx; in lpi2c_dma_submit()
806 dev_err(&lpi2c_imx->adapter.dev, "submitting DMA failed, use pio\n"); in lpi2c_dma_submit()
811 dma->using_pio_mode = false; in lpi2c_dma_submit()
819 return -EINVAL; in lpi2c_dma_submit()
824 return -EINVAL; in lpi2c_dma_submit()
831 for (i = fifosize / 2; i > 0; i--) in lpi2c_imx_find_max_burst_num()
839 * For a highest DMA efficiency, tx/rx burst number should be calculated according
844 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_imx_dma_burst_num_calculate()
847 if (dma->dma_msg_flag & I2C_M_RD) { in lpi2c_imx_dma_burst_num_calculate()
849 * One RX cmd word can trigger DMA receive no more than 256 bytes. in lpi2c_imx_dma_burst_num_calculate()
850 * The number of RX cmd words should be calculated based on the data in lpi2c_imx_dma_burst_num_calculate()
853 cmd_num = DIV_ROUND_UP(dma->dma_len, CHUNK_DATA); in lpi2c_imx_dma_burst_num_calculate()
854 dma->tx_burst_num = lpi2c_imx_find_max_burst_num(lpi2c_imx->txfifosize, in lpi2c_imx_dma_burst_num_calculate()
856 dma->rx_burst_num = lpi2c_imx_find_max_burst_num(lpi2c_imx->rxfifosize, in lpi2c_imx_dma_burst_num_calculate()
857 dma->dma_len); in lpi2c_imx_dma_burst_num_calculate()
859 dma->tx_burst_num = lpi2c_imx_find_max_burst_num(lpi2c_imx->txfifosize, in lpi2c_imx_dma_burst_num_calculate()
860 dma->dma_len); in lpi2c_imx_dma_burst_num_calculate()
866 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_dma_config()
867 struct dma_slave_config rx = {}, tx = {}; in lpi2c_dma_config() local
872 if (dma->dma_msg_flag & I2C_M_RD) { in lpi2c_dma_config()
873 tx.dst_addr = dma->phy_addr + LPI2C_MTDR; in lpi2c_dma_config()
875 tx.dst_maxburst = dma->tx_burst_num; in lpi2c_dma_config()
877 ret = dmaengine_slave_config(dma->chan_tx, &tx); in lpi2c_dma_config()
881 rx.src_addr = dma->phy_addr + LPI2C_MRDR; in lpi2c_dma_config()
882 rx.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE; in lpi2c_dma_config()
883 rx.src_maxburst = dma->rx_burst_num; in lpi2c_dma_config()
884 rx.direction = DMA_DEV_TO_MEM; in lpi2c_dma_config()
885 ret = dmaengine_slave_config(dma->chan_rx, &rx); in lpi2c_dma_config()
889 tx.dst_addr = dma->phy_addr + LPI2C_MTDR; in lpi2c_dma_config()
891 tx.dst_maxburst = dma->tx_burst_num; in lpi2c_dma_config()
893 ret = dmaengine_slave_config(dma->chan_tx, &tx); in lpi2c_dma_config()
903 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_dma_enable()
906 * the transmit FIFO is equal or less than TX watermark. in lpi2c_dma_enable()
907 * RX interrupt will be triggered when the number of words in in lpi2c_dma_enable()
908 * the receive FIFO is greater than RX watermark. in lpi2c_dma_enable()
909 * In order to trigger the DMA interrupt, TX watermark should be in lpi2c_dma_enable()
910 * set equal to the DMA TX burst number but RX watermark should in lpi2c_dma_enable()
911 * be set less than the DMA RX burst number. in lpi2c_dma_enable()
913 if (dma->dma_msg_flag & I2C_M_RD) { in lpi2c_dma_enable()
914 /* Set I2C TX/RX watermark */ in lpi2c_dma_enable()
915 writel(dma->tx_burst_num | (dma->rx_burst_num - 1) << 16, in lpi2c_dma_enable()
916 lpi2c_imx->base + LPI2C_MFCR); in lpi2c_dma_enable()
917 /* Enable I2C DMA TX/RX function */ in lpi2c_dma_enable()
918 writel(MDER_TDDE | MDER_RDDE, lpi2c_imx->base + LPI2C_MDER); in lpi2c_dma_enable()
920 /* Set I2C TX watermark */ in lpi2c_dma_enable()
921 writel(dma->tx_burst_num, lpi2c_imx->base + LPI2C_MFCR); in lpi2c_dma_enable()
923 writel(MDER_TDDE, lpi2c_imx->base + LPI2C_MDER); in lpi2c_dma_enable()
932 * data word into TXFIFO, but in RX DMA mode it is different.
935 * Bits 8-10 are the command data field and Bits 0-7 are the transmit
944 * So when in RX DMA mode, the TX channel also must to be configured to
945 * send RX command words and the RX command word must be set in advance
951 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_imx_dma_xfer()
955 dma->using_pio_mode = true; in lpi2c_imx_dma_xfer()
957 dma->dma_len = msg->len; in lpi2c_imx_dma_xfer()
958 dma->dma_msg_flag = msg->flags; in lpi2c_imx_dma_xfer()
959 dma->dma_buf = i2c_get_dma_safe_msg_buf(msg, I2C_DMA_THRESHOLD); in lpi2c_imx_dma_xfer()
960 if (!dma->dma_buf) in lpi2c_imx_dma_xfer()
961 return -ENOMEM; in lpi2c_imx_dma_xfer()
965 dev_err(&lpi2c_imx->adapter.dev, "Failed to configure DMA (%d)\n", ret); in lpi2c_imx_dma_xfer()
973 dev_err(&lpi2c_imx->adapter.dev, "DMA submission failed (%d)\n", ret); in lpi2c_imx_dma_xfer()
977 if (dma->dma_msg_flag & I2C_M_RD) { in lpi2c_imx_dma_xfer()
992 if ((readl(lpi2c_imx->base + LPI2C_MSR) & MSR_NDF) && !ret) { in lpi2c_imx_dma_xfer()
993 ret = -EIO; in lpi2c_imx_dma_xfer()
997 if (dma->dma_msg_flag & I2C_M_RD) in lpi2c_imx_dma_xfer()
998 dma_unmap_single(dma->chan_tx->device->dev, dma->dma_tx_addr, in lpi2c_imx_dma_xfer()
999 dma->rx_cmd_buf_len, DMA_TO_DEVICE); in lpi2c_imx_dma_xfer()
1005 if (dma->dma_msg_flag & I2C_M_RD) in lpi2c_imx_dma_xfer()
1011 writel(0, lpi2c_imx->base + LPI2C_MDER); in lpi2c_imx_dma_xfer()
1013 if (dma->dma_msg_flag & I2C_M_RD) in lpi2c_imx_dma_xfer()
1014 kfree(dma->rx_cmd_buf); in lpi2c_imx_dma_xfer()
1017 i2c_put_dma_safe_msg_buf(dma->dma_buf, msg, false); in lpi2c_imx_dma_xfer()
1019 i2c_put_dma_safe_msg_buf(dma->dma_buf, msg, true); in lpi2c_imx_dma_xfer()
1044 lpi2c_imx->rx_buf = NULL; in lpi2c_imx_xfer_common()
1045 lpi2c_imx->tx_buf = NULL; in lpi2c_imx_xfer_common()
1046 lpi2c_imx->delivered = 0; in lpi2c_imx_xfer_common()
1047 lpi2c_imx->msglen = msgs[i].len; in lpi2c_imx_xfer_common()
1052 init_completion(&lpi2c_imx->complete); in lpi2c_imx_xfer_common()
1056 if (result && lpi2c_imx->dma->using_pio_mode) in lpi2c_imx_xfer_common()
1076 temp = readl(lpi2c_imx->base + LPI2C_MSR); in lpi2c_imx_xfer_common()
1078 result = -EIO; in lpi2c_imx_xfer_common()
1083 dev_dbg(&lpi2c_imx->adapter.dev, "<%s> exit with: %s: %d\n", __func__, in lpi2c_imx_xfer_common()
1108 writel(0, lpi2c_imx->base + LPI2C_SIER); in lpi2c_imx_target_isr()
1114 sasr = readl(lpi2c_imx->base + LPI2C_SASR); in lpi2c_imx_target_isr()
1117 i2c_slave_event(lpi2c_imx->target, I2C_SLAVE_READ_REQUESTED, &value); in lpi2c_imx_target_isr()
1118 writel(value, lpi2c_imx->base + LPI2C_STDR); in lpi2c_imx_target_isr()
1122 i2c_slave_event(lpi2c_imx->target, I2C_SLAVE_WRITE_REQUESTED, &value); in lpi2c_imx_target_isr()
1128 i2c_slave_event(lpi2c_imx->target, I2C_SLAVE_STOP, &value); in lpi2c_imx_target_isr()
1132 i2c_slave_event(lpi2c_imx->target, I2C_SLAVE_READ_PROCESSED, &value); in lpi2c_imx_target_isr()
1133 writel(value, lpi2c_imx->base + LPI2C_STDR); in lpi2c_imx_target_isr()
1138 value = readl(lpi2c_imx->base + LPI2C_SRDR); in lpi2c_imx_target_isr()
1139 i2c_slave_event(lpi2c_imx->target, I2C_SLAVE_WRITE_RECEIVED, &value); in lpi2c_imx_target_isr()
1144 writel(ssr & SSR_CLEAR_BITS, lpi2c_imx->base + LPI2C_SSR); in lpi2c_imx_target_isr()
1153 enabled = readl(lpi2c_imx->base + LPI2C_MIER); in lpi2c_imx_master_isr()
1156 temp = readl(lpi2c_imx->base + LPI2C_MSR); in lpi2c_imx_master_isr()
1160 complete(&lpi2c_imx->complete); in lpi2c_imx_master_isr()
1173 if (lpi2c_imx->target) { in lpi2c_imx_isr()
1174 u32 scr = readl(lpi2c_imx->base + LPI2C_SCR); in lpi2c_imx_isr()
1175 u32 ssr = readl(lpi2c_imx->base + LPI2C_SSR); in lpi2c_imx_isr()
1176 u32 sier_filter = ssr & readl(lpi2c_imx->base + LPI2C_SIER); in lpi2c_imx_isr()
1198 writel(SCR_RST, lpi2c_imx->base + LPI2C_SCR); in lpi2c_imx_target_init()
1199 writel(0, lpi2c_imx->base + LPI2C_SCR); in lpi2c_imx_target_init()
1202 writel((lpi2c_imx->target->addr << 1), lpi2c_imx->base + LPI2C_SAMR); in lpi2c_imx_target_init()
1204 writel(SCFGR1_RXSTALL | SCFGR1_TXDSTALL, lpi2c_imx->base + LPI2C_SCFGR1); in lpi2c_imx_target_init()
1229 writel(temp, lpi2c_imx->base + LPI2C_SCFGR2); in lpi2c_imx_target_init()
1237 writel(SCR_SEN | SCR_FILTEN, lpi2c_imx->base + LPI2C_SCR); in lpi2c_imx_target_init()
1240 writel(SLAVE_INT_FLAG, lpi2c_imx->base + LPI2C_SIER); in lpi2c_imx_target_init()
1245 struct lpi2c_imx_struct *lpi2c_imx = i2c_get_adapdata(client->adapter); in lpi2c_imx_register_target()
1248 if (lpi2c_imx->target) in lpi2c_imx_register_target()
1249 return -EBUSY; in lpi2c_imx_register_target()
1251 lpi2c_imx->target = client; in lpi2c_imx_register_target()
1253 ret = pm_runtime_resume_and_get(lpi2c_imx->adapter.dev.parent); in lpi2c_imx_register_target()
1255 dev_err(&lpi2c_imx->adapter.dev, "failed to resume i2c controller"); in lpi2c_imx_register_target()
1266 struct lpi2c_imx_struct *lpi2c_imx = i2c_get_adapdata(client->adapter); in lpi2c_imx_unregister_target()
1269 if (!lpi2c_imx->target) in lpi2c_imx_unregister_target()
1270 return -EINVAL; in lpi2c_imx_unregister_target()
1273 writel(0, lpi2c_imx->base + LPI2C_SAMR); in lpi2c_imx_unregister_target()
1275 writel(SCR_RST, lpi2c_imx->base + LPI2C_SCR); in lpi2c_imx_unregister_target()
1276 writel(0, lpi2c_imx->base + LPI2C_SCR); in lpi2c_imx_unregister_target()
1278 lpi2c_imx->target = NULL; in lpi2c_imx_unregister_target()
1280 ret = pm_runtime_put_sync(lpi2c_imx->adapter.dev.parent); in lpi2c_imx_unregister_target()
1282 dev_err(&lpi2c_imx->adapter.dev, "failed to suspend i2c controller"); in lpi2c_imx_unregister_target()
1290 struct i2c_bus_recovery_info *bri = &lpi2c_imx->rinfo; in lpi2c_imx_init_recovery_info()
1292 bri->pinctrl = devm_pinctrl_get(&pdev->dev); in lpi2c_imx_init_recovery_info()
1293 if (IS_ERR(bri->pinctrl)) in lpi2c_imx_init_recovery_info()
1294 return PTR_ERR(bri->pinctrl); in lpi2c_imx_init_recovery_info()
1296 lpi2c_imx->adapter.bus_recovery_info = bri; in lpi2c_imx_init_recovery_info()
1303 if (dma->chan_rx) in dma_exit()
1304 dma_release_channel(dma->chan_rx); in dma_exit()
1306 if (dma->chan_tx) in dma_exit()
1307 dma_release_channel(dma->chan_tx); in dma_exit()
1320 return -ENOMEM; in lpi2c_dma_init()
1322 dma->phy_addr = phy_addr; in lpi2c_dma_init()
1325 dma->chan_tx = dma_request_chan(dev, "tx"); in lpi2c_dma_init()
1326 if (IS_ERR(dma->chan_tx)) { in lpi2c_dma_init()
1327 ret = PTR_ERR(dma->chan_tx); in lpi2c_dma_init()
1328 if (ret != -ENODEV && ret != -EPROBE_DEFER) in lpi2c_dma_init()
1330 dma->chan_tx = NULL; in lpi2c_dma_init()
1334 /* Prepare for RX DMA: */ in lpi2c_dma_init()
1335 dma->chan_rx = dma_request_chan(dev, "rx"); in lpi2c_dma_init()
1336 if (IS_ERR(dma->chan_rx)) { in lpi2c_dma_init()
1337 ret = PTR_ERR(dma->chan_rx); in lpi2c_dma_init()
1338 if (ret != -ENODEV && ret != -EPROBE_DEFER) in lpi2c_dma_init()
1339 dev_err(dev, "can't request DMA rx channel (%d)\n", ret); in lpi2c_dma_init()
1340 dma->chan_rx = NULL; in lpi2c_dma_init()
1344 lpi2c_imx->can_use_dma = true; in lpi2c_dma_init()
1345 lpi2c_imx->dma = dma; in lpi2c_dma_init()
1368 { .compatible = "fsl,imx7ulp-lpi2c" },
1381 lpi2c_imx = devm_kzalloc(&pdev->dev, sizeof(*lpi2c_imx), GFP_KERNEL); in lpi2c_imx_probe()
1383 return -ENOMEM; in lpi2c_imx_probe()
1385 lpi2c_imx->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); in lpi2c_imx_probe()
1386 if (IS_ERR(lpi2c_imx->base)) in lpi2c_imx_probe()
1387 return PTR_ERR(lpi2c_imx->base); in lpi2c_imx_probe()
1393 lpi2c_imx->adapter.owner = THIS_MODULE; in lpi2c_imx_probe()
1394 lpi2c_imx->adapter.algo = &lpi2c_imx_algo; in lpi2c_imx_probe()
1395 lpi2c_imx->adapter.dev.parent = &pdev->dev; in lpi2c_imx_probe()
1396 lpi2c_imx->adapter.dev.of_node = pdev->dev.of_node; in lpi2c_imx_probe()
1397 strscpy(lpi2c_imx->adapter.name, pdev->name, in lpi2c_imx_probe()
1398 sizeof(lpi2c_imx->adapter.name)); in lpi2c_imx_probe()
1399 phy_addr = (dma_addr_t)res->start; in lpi2c_imx_probe()
1401 ret = devm_clk_bulk_get_all(&pdev->dev, &lpi2c_imx->clks); in lpi2c_imx_probe()
1403 return dev_err_probe(&pdev->dev, ret, "can't get I2C peripheral clock\n"); in lpi2c_imx_probe()
1404 lpi2c_imx->num_clks = ret; in lpi2c_imx_probe()
1406 ret = of_property_read_u32(pdev->dev.of_node, in lpi2c_imx_probe()
1407 "clock-frequency", &lpi2c_imx->bitrate); in lpi2c_imx_probe()
1409 lpi2c_imx->bitrate = I2C_MAX_STANDARD_MODE_FREQ; in lpi2c_imx_probe()
1411 ret = devm_request_irq(&pdev->dev, irq, lpi2c_imx_isr, IRQF_NO_SUSPEND, in lpi2c_imx_probe()
1412 pdev->name, lpi2c_imx); in lpi2c_imx_probe()
1414 return dev_err_probe(&pdev->dev, ret, "can't claim irq %d\n", irq); in lpi2c_imx_probe()
1416 i2c_set_adapdata(&lpi2c_imx->adapter, lpi2c_imx); in lpi2c_imx_probe()
1419 ret = clk_bulk_prepare_enable(lpi2c_imx->num_clks, lpi2c_imx->clks); in lpi2c_imx_probe()
1427 ret = devm_clk_rate_exclusive_get(&pdev->dev, lpi2c_imx->clks[0].clk); in lpi2c_imx_probe()
1429 return dev_err_probe(&pdev->dev, ret, in lpi2c_imx_probe()
1432 lpi2c_imx->rate_per = clk_get_rate(lpi2c_imx->clks[0].clk); in lpi2c_imx_probe()
1433 if (!lpi2c_imx->rate_per) in lpi2c_imx_probe()
1434 return dev_err_probe(&pdev->dev, -EINVAL, in lpi2c_imx_probe()
1437 pm_runtime_set_autosuspend_delay(&pdev->dev, I2C_PM_TIMEOUT); in lpi2c_imx_probe()
1438 pm_runtime_use_autosuspend(&pdev->dev); in lpi2c_imx_probe()
1439 pm_runtime_get_noresume(&pdev->dev); in lpi2c_imx_probe()
1440 pm_runtime_set_active(&pdev->dev); in lpi2c_imx_probe()
1441 pm_runtime_enable(&pdev->dev); in lpi2c_imx_probe()
1443 temp = readl(lpi2c_imx->base + LPI2C_PARAM); in lpi2c_imx_probe()
1444 lpi2c_imx->txfifosize = 1 << (temp & 0x0f); in lpi2c_imx_probe()
1445 lpi2c_imx->rxfifosize = 1 << ((temp >> 8) & 0x0f); in lpi2c_imx_probe()
1450 if (ret == -EPROBE_DEFER) in lpi2c_imx_probe()
1454 ret = lpi2c_dma_init(&pdev->dev, phy_addr); in lpi2c_imx_probe()
1456 if (ret == -EPROBE_DEFER) in lpi2c_imx_probe()
1458 dev_info(&pdev->dev, "use pio mode\n"); in lpi2c_imx_probe()
1461 ret = i2c_add_adapter(&lpi2c_imx->adapter); in lpi2c_imx_probe()
1465 pm_runtime_mark_last_busy(&pdev->dev); in lpi2c_imx_probe()
1466 pm_runtime_put_autosuspend(&pdev->dev); in lpi2c_imx_probe()
1468 dev_info(&lpi2c_imx->adapter.dev, "LPI2C adapter registered\n"); in lpi2c_imx_probe()
1473 pm_runtime_dont_use_autosuspend(&pdev->dev); in lpi2c_imx_probe()
1474 pm_runtime_put_sync(&pdev->dev); in lpi2c_imx_probe()
1475 pm_runtime_disable(&pdev->dev); in lpi2c_imx_probe()
1484 i2c_del_adapter(&lpi2c_imx->adapter); in lpi2c_imx_remove()
1486 pm_runtime_disable(&pdev->dev); in lpi2c_imx_remove()
1487 pm_runtime_dont_use_autosuspend(&pdev->dev); in lpi2c_imx_remove()
1494 clk_bulk_disable(lpi2c_imx->num_clks, lpi2c_imx->clks); in lpi2c_runtime_suspend()
1506 ret = clk_bulk_enable(lpi2c_imx->num_clks, lpi2c_imx->clks); in lpi2c_runtime_resume()
1534 if (lpi2c_imx->target) in lpi2c_resume_noirq()
1549 * after runtime PM is re-enabled (in resume_early()). However, this in lpi2c_suspend()
1558 * Finally, the resume() callback re-enables autosuspend, ensuring in lpi2c_suspend()