Lines Matching +full:filt +full:- +full:disable

1 // SPDX-License-Identifier: GPL-2.0+
11 #include <linux/dma-mapping.h>
29 #define DRIVER_NAME "imx-lpi2c"
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()
287 u8 prescale, filt, sethold, datavd; in lpi2c_imx_config() local
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()
297 filt = 0; in lpi2c_imx_config()
299 filt = 2; 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()
326 temp = (filt << 16) | (filt << 24); 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_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_put_autosuspend(lpi2c_imx->adapter.dev.parent); in lpi2c_imx_master_disable()
388 time_left = wait_for_completion_timeout(&lpi2c_imx->complete, HZ); in lpi2c_imx_pio_msg_complete()
390 return time_left ? 0 : -ETIMEDOUT; in lpi2c_imx_pio_msg_complete()
402 dev_dbg(&lpi2c_imx->adapter.dev, "NDF detected\n"); in lpi2c_imx_txfifo_empty()
403 return -EIO; in lpi2c_imx_txfifo_empty()
407 dev_dbg(&lpi2c_imx->adapter.dev, "txfifo empty timeout\n"); in lpi2c_imx_txfifo_empty()
408 if (lpi2c_imx->adapter.bus_recovery_info) in lpi2c_imx_txfifo_empty()
409 i2c_recover_bus(&lpi2c_imx->adapter); in lpi2c_imx_txfifo_empty()
410 return -ETIMEDOUT; in lpi2c_imx_txfifo_empty()
418 writel(lpi2c_imx->txfifosize >> 1, lpi2c_imx->base + LPI2C_MFCR); in lpi2c_imx_set_tx_watermark()
425 remaining = lpi2c_imx->msglen - lpi2c_imx->delivered; in lpi2c_imx_set_rx_watermark()
427 if (remaining > (lpi2c_imx->rxfifosize >> 1)) in lpi2c_imx_set_rx_watermark()
428 temp = lpi2c_imx->rxfifosize >> 1; in lpi2c_imx_set_rx_watermark()
432 writel(temp << 16, lpi2c_imx->base + LPI2C_MFCR); in lpi2c_imx_set_rx_watermark()
439 txcnt = readl(lpi2c_imx->base + LPI2C_MFSR) & 0xff; in lpi2c_imx_write_txfifo()
441 while (txcnt < lpi2c_imx->txfifosize) { in lpi2c_imx_write_txfifo()
442 if (lpi2c_imx->delivered == lpi2c_imx->msglen) in lpi2c_imx_write_txfifo()
445 data = lpi2c_imx->tx_buf[lpi2c_imx->delivered++]; in lpi2c_imx_write_txfifo()
446 writel(data, lpi2c_imx->base + LPI2C_MTDR); in lpi2c_imx_write_txfifo()
450 if (lpi2c_imx->delivered < lpi2c_imx->msglen) { in lpi2c_imx_write_txfifo()
457 complete(&lpi2c_imx->complete); in lpi2c_imx_write_txfifo()
468 data = readl(lpi2c_imx->base + LPI2C_MRDR); in lpi2c_imx_read_rxfifo()
472 lpi2c_imx->rx_buf[lpi2c_imx->delivered++] = data & 0xff; in lpi2c_imx_read_rxfifo()
477 * data read. Add it to msgs->len. in lpi2c_imx_read_rxfifo()
479 if (lpi2c_imx->block_data) { in lpi2c_imx_read_rxfifo()
480 blocklen = lpi2c_imx->rx_buf[0]; in lpi2c_imx_read_rxfifo()
481 lpi2c_imx->msglen += blocklen; in lpi2c_imx_read_rxfifo()
484 remaining = lpi2c_imx->msglen - lpi2c_imx->delivered; in lpi2c_imx_read_rxfifo()
488 complete(&lpi2c_imx->complete); in lpi2c_imx_read_rxfifo()
496 if (lpi2c_imx->block_data) { in lpi2c_imx_read_rxfifo()
497 lpi2c_imx->block_data = 0; in lpi2c_imx_read_rxfifo()
500 writel(temp, lpi2c_imx->base + LPI2C_MTDR); in lpi2c_imx_read_rxfifo()
501 } else if (!(lpi2c_imx->delivered & 0xff)) { in lpi2c_imx_read_rxfifo()
502 temp = (remaining > CHUNK_DATA ? CHUNK_DATA : remaining) - 1; in lpi2c_imx_read_rxfifo()
504 writel(temp, lpi2c_imx->base + LPI2C_MTDR); in lpi2c_imx_read_rxfifo()
516 lpi2c_imx->tx_buf = msgs->buf; in lpi2c_imx_write()
527 lpi2c_imx->tx_buf = msgs->buf; in lpi2c_imx_write_atomic()
534 return -EIO; in lpi2c_imx_write_atomic()
544 lpi2c_imx->rx_buf = msgs->buf; in lpi2c_imx_read_init()
545 lpi2c_imx->block_data = msgs->flags & I2C_M_RECV_LEN; in lpi2c_imx_read_init()
548 temp = msgs->len > CHUNK_DATA ? CHUNK_DATA - 1 : msgs->len - 1; in lpi2c_imx_read_init()
550 writel(temp, lpi2c_imx->base + LPI2C_MTDR); in lpi2c_imx_read_init()
557 rxcnt = (readl(lpi2c_imx->base + LPI2C_MFSR) >> 16) & 0xFF; in lpi2c_imx_read_chunk_atomic()
578 temp = readl(lpi2c_imx->base + LPI2C_MSR); in lpi2c_imx_read_atomic()
581 return -EIO; in lpi2c_imx_read_atomic()
584 tmo_us -= 100; in lpi2c_imx_read_atomic()
587 return -ETIMEDOUT; in lpi2c_imx_read_atomic()
592 if (!lpi2c_imx->can_use_dma) in is_use_dma()
599 return !(msg->len < I2C_DMA_THRESHOLD); in is_use_dma()
605 reinit_completion(&lpi2c_imx->complete); in lpi2c_imx_pio_xfer()
607 if (msg->flags & I2C_M_RD) { in lpi2c_imx_pio_xfer()
620 if (msg->flags & I2C_M_RD) { in lpi2c_imx_pio_xfer_atomic()
632 time = 8 * lpi2c_imx->dma->dma_len * 1000 / lpi2c_imx->bitrate; in lpi2c_imx_dma_timeout_calculate()
643 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_imx_alloc_rx_cmd_buf()
644 u16 rx_remain = dma->dma_len; in lpi2c_imx_alloc_rx_cmd_buf()
654 dma->rx_cmd_buf = kcalloc(cmd_num, sizeof(u16), GFP_KERNEL); in lpi2c_imx_alloc_rx_cmd_buf()
655 dma->rx_cmd_buf_len = cmd_num * sizeof(u16); in lpi2c_imx_alloc_rx_cmd_buf()
657 if (!dma->rx_cmd_buf) { in lpi2c_imx_alloc_rx_cmd_buf()
658 dev_err(&lpi2c_imx->adapter.dev, "Alloc RX cmd buffer failed\n"); in lpi2c_imx_alloc_rx_cmd_buf()
659 return -ENOMEM; in lpi2c_imx_alloc_rx_cmd_buf()
663 temp = rx_remain > CHUNK_DATA ? CHUNK_DATA - 1 : rx_remain - 1; in lpi2c_imx_alloc_rx_cmd_buf()
665 rx_remain -= CHUNK_DATA; in lpi2c_imx_alloc_rx_cmd_buf()
666 dma->rx_cmd_buf[i] = temp; in lpi2c_imx_alloc_rx_cmd_buf()
677 time_left = wait_for_completion_timeout(&lpi2c_imx->complete, time); in lpi2c_imx_dma_msg_complete()
679 dev_err(&lpi2c_imx->adapter.dev, "I/O Error in DMA Data Transfer\n"); in lpi2c_imx_dma_msg_complete()
680 return -ETIMEDOUT; in lpi2c_imx_dma_msg_complete()
688 struct dma_chan *chan = dma->dma_data_dir == DMA_FROM_DEVICE in lpi2c_dma_unmap()
689 ? dma->chan_rx : dma->chan_tx; in lpi2c_dma_unmap()
691 dma_unmap_single(chan->device->dev, dma->dma_addr, in lpi2c_dma_unmap()
692 dma->dma_len, dma->dma_data_dir); in lpi2c_dma_unmap()
694 dma->dma_data_dir = DMA_NONE; in lpi2c_dma_unmap()
699 dmaengine_terminate_sync(dma->chan_tx); in lpi2c_cleanup_rx_cmd_dma()
700 dma_unmap_single(dma->chan_tx->device->dev, dma->dma_tx_addr, in lpi2c_cleanup_rx_cmd_dma()
701 dma->rx_cmd_buf_len, DMA_TO_DEVICE); in lpi2c_cleanup_rx_cmd_dma()
706 if (dma->dma_data_dir == DMA_FROM_DEVICE) in lpi2c_cleanup_dma()
707 dmaengine_terminate_sync(dma->chan_rx); in lpi2c_cleanup_dma()
708 else if (dma->dma_data_dir == DMA_TO_DEVICE) in lpi2c_cleanup_dma()
709 dmaengine_terminate_sync(dma->chan_tx); in lpi2c_cleanup_dma()
718 complete(&lpi2c_imx->complete); in lpi2c_dma_callback()
724 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_dma_rx_cmd_submit()
725 struct dma_chan *txchan = dma->chan_tx; in lpi2c_dma_rx_cmd_submit()
728 dma->dma_tx_addr = dma_map_single(txchan->device->dev, in lpi2c_dma_rx_cmd_submit()
729 dma->rx_cmd_buf, dma->rx_cmd_buf_len, in lpi2c_dma_rx_cmd_submit()
731 if (dma_mapping_error(txchan->device->dev, dma->dma_tx_addr)) { in lpi2c_dma_rx_cmd_submit()
732 dev_err(&lpi2c_imx->adapter.dev, "DMA map failed, use pio\n"); in lpi2c_dma_rx_cmd_submit()
733 return -EINVAL; in lpi2c_dma_rx_cmd_submit()
736 rx_cmd_desc = dmaengine_prep_slave_single(txchan, dma->dma_tx_addr, in lpi2c_dma_rx_cmd_submit()
737 dma->rx_cmd_buf_len, DMA_MEM_TO_DEV, in lpi2c_dma_rx_cmd_submit()
740 dev_err(&lpi2c_imx->adapter.dev, "DMA prep slave sg failed, use pio\n"); in lpi2c_dma_rx_cmd_submit()
746 dev_err(&lpi2c_imx->adapter.dev, "submitting DMA failed, use pio\n"); in lpi2c_dma_rx_cmd_submit()
755 dma_unmap_single(txchan->device->dev, dma->dma_tx_addr, in lpi2c_dma_rx_cmd_submit()
756 dma->rx_cmd_buf_len, DMA_TO_DEVICE); in lpi2c_dma_rx_cmd_submit()
757 return -EINVAL; in lpi2c_dma_rx_cmd_submit()
760 dma_unmap_single(txchan->device->dev, dma->dma_tx_addr, in lpi2c_dma_rx_cmd_submit()
761 dma->rx_cmd_buf_len, DMA_TO_DEVICE); in lpi2c_dma_rx_cmd_submit()
763 return -EINVAL; in lpi2c_dma_rx_cmd_submit()
768 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_dma_submit()
773 if (dma->dma_msg_flag & I2C_M_RD) { in lpi2c_dma_submit()
774 chan = dma->chan_rx; in lpi2c_dma_submit()
775 dma->dma_data_dir = DMA_FROM_DEVICE; in lpi2c_dma_submit()
776 dma->dma_transfer_dir = DMA_DEV_TO_MEM; in lpi2c_dma_submit()
778 chan = dma->chan_tx; in lpi2c_dma_submit()
779 dma->dma_data_dir = DMA_TO_DEVICE; in lpi2c_dma_submit()
780 dma->dma_transfer_dir = DMA_MEM_TO_DEV; in lpi2c_dma_submit()
783 dma->dma_addr = dma_map_single(chan->device->dev, in lpi2c_dma_submit()
784 dma->dma_buf, dma->dma_len, dma->dma_data_dir); in lpi2c_dma_submit()
785 if (dma_mapping_error(chan->device->dev, dma->dma_addr)) { in lpi2c_dma_submit()
786 dev_err(&lpi2c_imx->adapter.dev, "DMA map failed, use pio\n"); in lpi2c_dma_submit()
787 return -EINVAL; in lpi2c_dma_submit()
790 desc = dmaengine_prep_slave_single(chan, dma->dma_addr, in lpi2c_dma_submit()
791 dma->dma_len, dma->dma_transfer_dir, in lpi2c_dma_submit()
794 dev_err(&lpi2c_imx->adapter.dev, "DMA prep slave sg failed, use pio\n"); in lpi2c_dma_submit()
798 reinit_completion(&lpi2c_imx->complete); in lpi2c_dma_submit()
799 desc->callback = lpi2c_dma_callback; in lpi2c_dma_submit()
800 desc->callback_param = lpi2c_imx; in lpi2c_dma_submit()
804 dev_err(&lpi2c_imx->adapter.dev, "submitting DMA failed, use pio\n"); in lpi2c_dma_submit()
809 dma->using_pio_mode = false; in lpi2c_dma_submit()
817 return -EINVAL; in lpi2c_dma_submit()
822 return -EINVAL; in lpi2c_dma_submit()
829 for (i = fifosize / 2; i > 0; i--) in lpi2c_imx_find_max_burst_num()
842 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_imx_dma_burst_num_calculate()
845 if (dma->dma_msg_flag & I2C_M_RD) { in lpi2c_imx_dma_burst_num_calculate()
851 cmd_num = DIV_ROUND_UP(dma->dma_len, CHUNK_DATA); in lpi2c_imx_dma_burst_num_calculate()
852 dma->tx_burst_num = lpi2c_imx_find_max_burst_num(lpi2c_imx->txfifosize, in lpi2c_imx_dma_burst_num_calculate()
854 dma->rx_burst_num = lpi2c_imx_find_max_burst_num(lpi2c_imx->rxfifosize, in lpi2c_imx_dma_burst_num_calculate()
855 dma->dma_len); in lpi2c_imx_dma_burst_num_calculate()
857 dma->tx_burst_num = lpi2c_imx_find_max_burst_num(lpi2c_imx->txfifosize, in lpi2c_imx_dma_burst_num_calculate()
858 dma->dma_len); in lpi2c_imx_dma_burst_num_calculate()
864 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_dma_config()
870 if (dma->dma_msg_flag & I2C_M_RD) { in lpi2c_dma_config()
871 tx.dst_addr = dma->phy_addr + LPI2C_MTDR; in lpi2c_dma_config()
873 tx.dst_maxburst = dma->tx_burst_num; in lpi2c_dma_config()
875 ret = dmaengine_slave_config(dma->chan_tx, &tx); in lpi2c_dma_config()
879 rx.src_addr = dma->phy_addr + LPI2C_MRDR; in lpi2c_dma_config()
881 rx.src_maxburst = dma->rx_burst_num; in lpi2c_dma_config()
883 ret = dmaengine_slave_config(dma->chan_rx, &rx); in lpi2c_dma_config()
887 tx.dst_addr = dma->phy_addr + LPI2C_MTDR; in lpi2c_dma_config()
889 tx.dst_maxburst = dma->tx_burst_num; in lpi2c_dma_config()
891 ret = dmaengine_slave_config(dma->chan_tx, &tx); in lpi2c_dma_config()
901 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_dma_enable()
911 if (dma->dma_msg_flag & I2C_M_RD) { in lpi2c_dma_enable()
913 writel(dma->tx_burst_num | (dma->rx_burst_num - 1) << 16, in lpi2c_dma_enable()
914 lpi2c_imx->base + LPI2C_MFCR); in lpi2c_dma_enable()
916 writel(MDER_TDDE | MDER_RDDE, lpi2c_imx->base + LPI2C_MDER); in lpi2c_dma_enable()
919 writel(dma->tx_burst_num, lpi2c_imx->base + LPI2C_MFCR); in lpi2c_dma_enable()
921 writel(MDER_TDDE, lpi2c_imx->base + LPI2C_MDER); in lpi2c_dma_enable()
933 * Bits 8-10 are the command data field and Bits 0-7 are the transmit
949 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_imx_dma_xfer()
953 dma->using_pio_mode = true; in lpi2c_imx_dma_xfer()
955 dma->dma_len = msg->len; in lpi2c_imx_dma_xfer()
956 dma->dma_msg_flag = msg->flags; in lpi2c_imx_dma_xfer()
957 dma->dma_buf = i2c_get_dma_safe_msg_buf(msg, I2C_DMA_THRESHOLD); in lpi2c_imx_dma_xfer()
958 if (!dma->dma_buf) in lpi2c_imx_dma_xfer()
959 return -ENOMEM; in lpi2c_imx_dma_xfer()
963 dev_err(&lpi2c_imx->adapter.dev, "Failed to configure DMA (%d)\n", ret); in lpi2c_imx_dma_xfer()
971 dev_err(&lpi2c_imx->adapter.dev, "DMA submission failed (%d)\n", ret); in lpi2c_imx_dma_xfer()
975 if (dma->dma_msg_flag & I2C_M_RD) { in lpi2c_imx_dma_xfer()
990 if ((readl(lpi2c_imx->base + LPI2C_MSR) & MSR_NDF) && !ret) { in lpi2c_imx_dma_xfer()
991 ret = -EIO; in lpi2c_imx_dma_xfer()
995 if (dma->dma_msg_flag & I2C_M_RD) in lpi2c_imx_dma_xfer()
996 dma_unmap_single(dma->chan_tx->device->dev, dma->dma_tx_addr, in lpi2c_imx_dma_xfer()
997 dma->rx_cmd_buf_len, DMA_TO_DEVICE); in lpi2c_imx_dma_xfer()
1003 if (dma->dma_msg_flag & I2C_M_RD) in lpi2c_imx_dma_xfer()
1008 /* Disable I2C DMA function */ in lpi2c_imx_dma_xfer()
1009 writel(0, lpi2c_imx->base + LPI2C_MDER); in lpi2c_imx_dma_xfer()
1011 if (dma->dma_msg_flag & I2C_M_RD) in lpi2c_imx_dma_xfer()
1012 kfree(dma->rx_cmd_buf); in lpi2c_imx_dma_xfer()
1015 i2c_put_dma_safe_msg_buf(dma->dma_buf, msg, false); in lpi2c_imx_dma_xfer()
1017 i2c_put_dma_safe_msg_buf(dma->dma_buf, msg, true); in lpi2c_imx_dma_xfer()
1036 goto disable; in lpi2c_imx_xfer_common()
1042 lpi2c_imx->rx_buf = NULL; in lpi2c_imx_xfer_common()
1043 lpi2c_imx->tx_buf = NULL; in lpi2c_imx_xfer_common()
1044 lpi2c_imx->delivered = 0; in lpi2c_imx_xfer_common()
1045 lpi2c_imx->msglen = msgs[i].len; in lpi2c_imx_xfer_common()
1050 init_completion(&lpi2c_imx->complete); in lpi2c_imx_xfer_common()
1054 if (result && lpi2c_imx->dma->using_pio_mode) in lpi2c_imx_xfer_common()
1074 temp = readl(lpi2c_imx->base + LPI2C_MSR); in lpi2c_imx_xfer_common()
1076 result = -EIO; in lpi2c_imx_xfer_common()
1078 disable: in lpi2c_imx_xfer_common()
1081 dev_dbg(&lpi2c_imx->adapter.dev, "<%s> exit with: %s: %d\n", __func__, in lpi2c_imx_xfer_common()
1106 writel(0, lpi2c_imx->base + LPI2C_SIER); in lpi2c_imx_target_isr()
1112 sasr = readl(lpi2c_imx->base + LPI2C_SASR); in lpi2c_imx_target_isr()
1115 i2c_slave_event(lpi2c_imx->target, I2C_SLAVE_READ_REQUESTED, &value); in lpi2c_imx_target_isr()
1116 writel(value, lpi2c_imx->base + LPI2C_STDR); in lpi2c_imx_target_isr()
1120 i2c_slave_event(lpi2c_imx->target, I2C_SLAVE_WRITE_REQUESTED, &value); in lpi2c_imx_target_isr()
1126 i2c_slave_event(lpi2c_imx->target, I2C_SLAVE_STOP, &value); in lpi2c_imx_target_isr()
1130 i2c_slave_event(lpi2c_imx->target, I2C_SLAVE_READ_PROCESSED, &value); in lpi2c_imx_target_isr()
1131 writel(value, lpi2c_imx->base + LPI2C_STDR); in lpi2c_imx_target_isr()
1136 value = readl(lpi2c_imx->base + LPI2C_SRDR); in lpi2c_imx_target_isr()
1137 i2c_slave_event(lpi2c_imx->target, I2C_SLAVE_WRITE_RECEIVED, &value); in lpi2c_imx_target_isr()
1142 writel(ssr & SSR_CLEAR_BITS, lpi2c_imx->base + LPI2C_SSR); in lpi2c_imx_target_isr()
1151 enabled = readl(lpi2c_imx->base + LPI2C_MIER); in lpi2c_imx_master_isr()
1154 temp = readl(lpi2c_imx->base + LPI2C_MSR); in lpi2c_imx_master_isr()
1158 complete(&lpi2c_imx->complete); in lpi2c_imx_master_isr()
1171 if (lpi2c_imx->target) { in lpi2c_imx_isr()
1172 u32 scr = readl(lpi2c_imx->base + LPI2C_SCR); in lpi2c_imx_isr()
1173 u32 ssr = readl(lpi2c_imx->base + LPI2C_SSR); in lpi2c_imx_isr()
1174 u32 sier_filter = ssr & readl(lpi2c_imx->base + LPI2C_SIER); in lpi2c_imx_isr()
1196 writel(SCR_RST, lpi2c_imx->base + LPI2C_SCR); in lpi2c_imx_target_init()
1197 writel(0, lpi2c_imx->base + LPI2C_SCR); in lpi2c_imx_target_init()
1200 writel((lpi2c_imx->target->addr << 1), lpi2c_imx->base + LPI2C_SAMR); in lpi2c_imx_target_init()
1202 writel(SCFGR1_RXSTALL | SCFGR1_TXDSTALL, lpi2c_imx->base + LPI2C_SCFGR1); in lpi2c_imx_target_init()
1227 writel(temp, lpi2c_imx->base + LPI2C_SCFGR2); in lpi2c_imx_target_init()
1235 writel(SCR_SEN | SCR_FILTEN, lpi2c_imx->base + LPI2C_SCR); in lpi2c_imx_target_init()
1238 writel(SLAVE_INT_FLAG, lpi2c_imx->base + LPI2C_SIER); in lpi2c_imx_target_init()
1243 struct lpi2c_imx_struct *lpi2c_imx = i2c_get_adapdata(client->adapter); in lpi2c_imx_register_target()
1246 if (lpi2c_imx->target) in lpi2c_imx_register_target()
1247 return -EBUSY; in lpi2c_imx_register_target()
1249 lpi2c_imx->target = client; in lpi2c_imx_register_target()
1251 ret = pm_runtime_resume_and_get(lpi2c_imx->adapter.dev.parent); in lpi2c_imx_register_target()
1253 dev_err(&lpi2c_imx->adapter.dev, "failed to resume i2c controller"); in lpi2c_imx_register_target()
1264 struct lpi2c_imx_struct *lpi2c_imx = i2c_get_adapdata(client->adapter); in lpi2c_imx_unregister_target()
1267 if (!lpi2c_imx->target) in lpi2c_imx_unregister_target()
1268 return -EINVAL; in lpi2c_imx_unregister_target()
1271 writel(0, lpi2c_imx->base + LPI2C_SAMR); in lpi2c_imx_unregister_target()
1273 writel(SCR_RST, lpi2c_imx->base + LPI2C_SCR); in lpi2c_imx_unregister_target()
1274 writel(0, lpi2c_imx->base + LPI2C_SCR); in lpi2c_imx_unregister_target()
1276 lpi2c_imx->target = NULL; in lpi2c_imx_unregister_target()
1278 ret = pm_runtime_put_sync(lpi2c_imx->adapter.dev.parent); in lpi2c_imx_unregister_target()
1280 dev_err(&lpi2c_imx->adapter.dev, "failed to suspend i2c controller"); in lpi2c_imx_unregister_target()
1288 struct i2c_bus_recovery_info *bri = &lpi2c_imx->rinfo; in lpi2c_imx_init_recovery_info()
1290 bri->pinctrl = devm_pinctrl_get(&pdev->dev); in lpi2c_imx_init_recovery_info()
1291 if (IS_ERR(bri->pinctrl)) in lpi2c_imx_init_recovery_info()
1292 return PTR_ERR(bri->pinctrl); in lpi2c_imx_init_recovery_info()
1294 lpi2c_imx->adapter.bus_recovery_info = bri; in lpi2c_imx_init_recovery_info()
1301 if (dma->chan_rx) in dma_exit()
1302 dma_release_channel(dma->chan_rx); in dma_exit()
1304 if (dma->chan_tx) in dma_exit()
1305 dma_release_channel(dma->chan_tx); in dma_exit()
1318 return -ENOMEM; in lpi2c_dma_init()
1320 dma->phy_addr = phy_addr; in lpi2c_dma_init()
1323 dma->chan_tx = dma_request_chan(dev, "tx"); in lpi2c_dma_init()
1324 if (IS_ERR(dma->chan_tx)) { in lpi2c_dma_init()
1325 ret = PTR_ERR(dma->chan_tx); in lpi2c_dma_init()
1326 if (ret != -ENODEV && ret != -EPROBE_DEFER) in lpi2c_dma_init()
1328 dma->chan_tx = NULL; in lpi2c_dma_init()
1333 dma->chan_rx = dma_request_chan(dev, "rx"); in lpi2c_dma_init()
1334 if (IS_ERR(dma->chan_rx)) { in lpi2c_dma_init()
1335 ret = PTR_ERR(dma->chan_rx); in lpi2c_dma_init()
1336 if (ret != -ENODEV && ret != -EPROBE_DEFER) in lpi2c_dma_init()
1338 dma->chan_rx = NULL; in lpi2c_dma_init()
1342 lpi2c_imx->can_use_dma = true; in lpi2c_dma_init()
1343 lpi2c_imx->dma = dma; in lpi2c_dma_init()
1366 { .compatible = "fsl,imx7ulp-lpi2c" },
1379 lpi2c_imx = devm_kzalloc(&pdev->dev, sizeof(*lpi2c_imx), GFP_KERNEL); in lpi2c_imx_probe()
1381 return -ENOMEM; in lpi2c_imx_probe()
1383 lpi2c_imx->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); in lpi2c_imx_probe()
1384 if (IS_ERR(lpi2c_imx->base)) in lpi2c_imx_probe()
1385 return PTR_ERR(lpi2c_imx->base); in lpi2c_imx_probe()
1391 lpi2c_imx->adapter.owner = THIS_MODULE; in lpi2c_imx_probe()
1392 lpi2c_imx->adapter.algo = &lpi2c_imx_algo; in lpi2c_imx_probe()
1393 lpi2c_imx->adapter.dev.parent = &pdev->dev; in lpi2c_imx_probe()
1394 lpi2c_imx->adapter.dev.of_node = pdev->dev.of_node; in lpi2c_imx_probe()
1395 strscpy(lpi2c_imx->adapter.name, pdev->name, in lpi2c_imx_probe()
1396 sizeof(lpi2c_imx->adapter.name)); in lpi2c_imx_probe()
1397 phy_addr = (dma_addr_t)res->start; in lpi2c_imx_probe()
1399 ret = devm_clk_bulk_get_all(&pdev->dev, &lpi2c_imx->clks); in lpi2c_imx_probe()
1401 return dev_err_probe(&pdev->dev, ret, "can't get I2C peripheral clock\n"); in lpi2c_imx_probe()
1402 lpi2c_imx->num_clks = ret; in lpi2c_imx_probe()
1404 ret = of_property_read_u32(pdev->dev.of_node, in lpi2c_imx_probe()
1405 "clock-frequency", &lpi2c_imx->bitrate); in lpi2c_imx_probe()
1407 lpi2c_imx->bitrate = I2C_MAX_STANDARD_MODE_FREQ; in lpi2c_imx_probe()
1409 ret = devm_request_irq(&pdev->dev, irq, lpi2c_imx_isr, IRQF_NO_SUSPEND, in lpi2c_imx_probe()
1410 pdev->name, lpi2c_imx); in lpi2c_imx_probe()
1412 return dev_err_probe(&pdev->dev, ret, "can't claim irq %d\n", irq); in lpi2c_imx_probe()
1414 i2c_set_adapdata(&lpi2c_imx->adapter, lpi2c_imx); in lpi2c_imx_probe()
1417 ret = clk_bulk_prepare_enable(lpi2c_imx->num_clks, lpi2c_imx->clks); in lpi2c_imx_probe()
1425 ret = devm_clk_rate_exclusive_get(&pdev->dev, lpi2c_imx->clks[0].clk); in lpi2c_imx_probe()
1427 return dev_err_probe(&pdev->dev, ret, in lpi2c_imx_probe()
1430 lpi2c_imx->rate_per = clk_get_rate(lpi2c_imx->clks[0].clk); in lpi2c_imx_probe()
1431 if (!lpi2c_imx->rate_per) in lpi2c_imx_probe()
1432 return dev_err_probe(&pdev->dev, -EINVAL, in lpi2c_imx_probe()
1435 pm_runtime_set_autosuspend_delay(&pdev->dev, I2C_PM_TIMEOUT); in lpi2c_imx_probe()
1436 pm_runtime_use_autosuspend(&pdev->dev); in lpi2c_imx_probe()
1437 pm_runtime_get_noresume(&pdev->dev); in lpi2c_imx_probe()
1438 pm_runtime_set_active(&pdev->dev); in lpi2c_imx_probe()
1439 pm_runtime_enable(&pdev->dev); in lpi2c_imx_probe()
1441 temp = readl(lpi2c_imx->base + LPI2C_PARAM); in lpi2c_imx_probe()
1442 lpi2c_imx->txfifosize = 1 << (temp & 0x0f); in lpi2c_imx_probe()
1443 lpi2c_imx->rxfifosize = 1 << ((temp >> 8) & 0x0f); in lpi2c_imx_probe()
1448 if (ret == -EPROBE_DEFER) in lpi2c_imx_probe()
1452 ret = lpi2c_dma_init(&pdev->dev, phy_addr); in lpi2c_imx_probe()
1454 if (ret == -EPROBE_DEFER) in lpi2c_imx_probe()
1456 dev_info(&pdev->dev, "use pio mode\n"); in lpi2c_imx_probe()
1459 ret = i2c_add_adapter(&lpi2c_imx->adapter); in lpi2c_imx_probe()
1463 pm_runtime_put_autosuspend(&pdev->dev); in lpi2c_imx_probe()
1465 dev_info(&lpi2c_imx->adapter.dev, "LPI2C adapter registered\n"); in lpi2c_imx_probe()
1470 pm_runtime_dont_use_autosuspend(&pdev->dev); in lpi2c_imx_probe()
1471 pm_runtime_put_sync(&pdev->dev); in lpi2c_imx_probe()
1472 pm_runtime_disable(&pdev->dev); in lpi2c_imx_probe()
1481 i2c_del_adapter(&lpi2c_imx->adapter); in lpi2c_imx_remove()
1483 pm_runtime_disable(&pdev->dev); in lpi2c_imx_remove()
1484 pm_runtime_dont_use_autosuspend(&pdev->dev); in lpi2c_imx_remove()
1491 clk_bulk_disable(lpi2c_imx->num_clks, lpi2c_imx->clks); in lpi2c_runtime_suspend()
1503 ret = clk_bulk_enable(lpi2c_imx->num_clks, lpi2c_imx->clks); in lpi2c_runtime_resume()
1531 if (lpi2c_imx->target) in lpi2c_resume_noirq()
1546 * after runtime PM is re-enabled (in resume_early()). However, this in lpi2c_suspend()
1555 * Finally, the resume() callback re-enables autosuspend, ensuring in lpi2c_suspend()