Lines Matching full:dma
11 #include <linux/dma-mapping.h>
34 #define LPI2C_MDER 0x1C /* i2c DMA enable */
49 #define LPI2C_SDER 0x11C /* i2c target DMA enable */
186 struct lpi2c_imx_dma *dma; member
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() local
572 u16 rx_remain = dma->dma_len; in lpi2c_imx_alloc_rx_cmd_buf()
577 * Calculate the number of rx command words via the DMA TX channel 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()
594 dma->rx_cmd_buf[i] = temp; in lpi2c_imx_alloc_rx_cmd_buf()
607 dev_err(&lpi2c_imx->adapter.dev, "I/O Error in DMA Data Transfer\n"); in lpi2c_imx_dma_msg_complete()
614 static void lpi2c_dma_unmap(struct lpi2c_imx_dma *dma) in lpi2c_dma_unmap() argument
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()
625 static void lpi2c_cleanup_rx_cmd_dma(struct lpi2c_imx_dma *dma) in lpi2c_cleanup_rx_cmd_dma() argument
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()
632 static void lpi2c_cleanup_dma(struct lpi2c_imx_dma *dma) in lpi2c_cleanup_dma() argument
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()
639 lpi2c_dma_unmap(dma); in lpi2c_cleanup_dma()
652 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_dma_rx_cmd_submit() local
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()
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()
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()
696 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_dma_submit() local
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()
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()
732 dev_err(&lpi2c_imx->adapter.dev, "submitting DMA failed, use pio\n"); in lpi2c_dma_submit()
736 /* Can't switch to PIO mode when DMA have started transfer */ in lpi2c_dma_submit()
737 dma->using_pio_mode = false; in lpi2c_dma_submit()
744 lpi2c_dma_unmap(dma); in lpi2c_dma_submit()
748 lpi2c_dma_unmap(dma); in lpi2c_dma_submit()
765 * For a highest DMA efficiency, tx/rx burst number should be calculated according
770 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_imx_dma_burst_num_calculate() local
773 if (dma->dma_msg_flag & I2C_M_RD) { in lpi2c_imx_dma_burst_num_calculate()
775 * One RX cmd word can trigger DMA receive no more than 256 bytes. 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() local
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() local
835 * In order to trigger the DMA interrupt, TX watermark should be in lpi2c_dma_enable()
836 * set equal to the DMA TX burst number but RX watermark should in lpi2c_dma_enable()
837 * be set less than the DMA RX burst number. 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()
843 /* Enable I2C DMA TX/RX function */ in lpi2c_dma_enable()
847 writel(dma->tx_burst_num, lpi2c_imx->base + LPI2C_MFCR); in lpi2c_dma_enable()
848 /* Enable I2C DMA TX function */ in lpi2c_dma_enable()
857 * When lpi2c is in TX DMA mode we can use one DMA TX channel to write
858 * data word into TXFIFO, but in RX DMA mode it is different.
870 * So when in RX DMA mode, the TX channel also must to be configured to
877 struct lpi2c_imx_dma *dma = lpi2c_imx->dma; in lpi2c_imx_dma_xfer() local
880 /* When DMA mode fails before transferring, CPU mode can be used. */ 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()
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()
917 /* When encountering NACK in transfer, clean up all DMA transfers */ 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()
926 lpi2c_dma_unmap(dma); in lpi2c_imx_dma_xfer()
931 if (dma->dma_msg_flag & I2C_M_RD) in lpi2c_imx_dma_xfer()
932 lpi2c_cleanup_rx_cmd_dma(dma); in lpi2c_imx_dma_xfer()
934 lpi2c_cleanup_dma(dma); in lpi2c_imx_dma_xfer()
936 /* Disable I2C DMA function */ 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()
978 if (result && lpi2c_imx->dma->using_pio_mode) in lpi2c_imx_xfer()
1212 static void dma_exit(struct device *dev, struct lpi2c_imx_dma *dma) in dma_exit() argument
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()
1220 devm_kfree(dev, dma); in dma_exit()
1226 struct lpi2c_imx_dma *dma; in lpi2c_dma_init() local
1229 dma = devm_kzalloc(dev, sizeof(*dma), GFP_KERNEL); in lpi2c_dma_init()
1230 if (!dma) in lpi2c_dma_init()
1233 dma->phy_addr = phy_addr; in lpi2c_dma_init()
1235 /* Prepare for TX DMA: */ 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()
1240 dev_err(dev, "can't request DMA tx channel (%d)\n", ret); in lpi2c_dma_init()
1241 dma->chan_tx = NULL; in lpi2c_dma_init()
1245 /* Prepare for RX DMA: */ 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()
1250 dev_err(dev, "can't request DMA rx channel (%d)\n", ret); in lpi2c_dma_init()
1251 dma->chan_rx = NULL; in lpi2c_dma_init()
1256 lpi2c_imx->dma = dma; in lpi2c_dma_init()
1260 dma_exit(dev, dma); in lpi2c_dma_init()
1363 /* Init DMA */ in lpi2c_imx_probe()