06.02.2019 22:16, Sowjanya Komatineni пишет: > +static void tegra_i2c_config_fifo_trig(struct tegra_i2c_dev *i2c_dev, > + size_t len) > +{ > + u32 val = 0, reg; > + u8 dma_burst = 0; > + struct dma_slave_config slv_config = {0}; > + struct dma_chan *chan; > + int ret; > + unsigned long reg_offset; > + > + if (i2c_dev->hw->has_mst_fifo) > + reg = I2C_MST_FIFO_CONTROL; > + else > + reg = I2C_FIFO_CONTROL; > + > + if (i2c_dev->is_curr_dma_xfer) { > + if (len & 0xF) > + dma_burst = 1; > + else if (len & 0x10) > + dma_burst = 4; > + else > + dma_burst = 8; > + > + if (i2c_dev->msg_read) { > + chan = i2c_dev->rx_dma_chan; > + reg_offset = tegra_i2c_reg_addr(i2c_dev, I2C_RX_FIFO); > + slv_config.src_addr = i2c_dev->base_phys + reg_offset; > + slv_config.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; > + slv_config.src_maxburst = dma_burst; > + > + if (i2c_dev->hw->has_mst_fifo) > + val |= I2C_MST_FIFO_CONTROL_RX_TRIG(dma_burst); > + else > + val |= I2C_FIFO_CONTROL_RX_TRIG(dma_burst); > + } else { > + chan = i2c_dev->tx_dma_chan; > + reg_offset = tegra_i2c_reg_addr(i2c_dev, I2C_TX_FIFO); > + slv_config.dst_addr = i2c_dev->base_phys + reg_offset; > + slv_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; > + slv_config.dst_maxburst = dma_burst; > + > + if (i2c_dev->hw->has_mst_fifo) > + val |= I2C_MST_FIFO_CONTROL_TX_TRIG(dma_burst); > + else > + val |= I2C_FIFO_CONTROL_TX_TRIG(dma_burst); > + } Minor nit: let's replace "|=" with "=" for consistency, and then "u32 val = 0," to just "u32 val,". > + > + slv_config.device_fc = true; > + ret = dmaengine_slave_config(chan, &slv_config); > + if (ret < 0) { > + dev_err(i2c_dev->dev, "DMA slave config failed: %d\n", > + ret); > + dev_err(i2c_dev->dev, "fallbacking to PIO\n"); > + tegra_i2c_release_dma(i2c_dev); > + i2c_dev->is_curr_dma_xfer = false; > + } else { > + goto out; > + } > + } > + > + if (i2c_dev->hw->has_mst_fifo) > + val = I2C_MST_FIFO_CONTROL_TX_TRIG(8) | > + I2C_MST_FIFO_CONTROL_RX_TRIG(1); > + else > + val = I2C_FIFO_CONTROL_TX_TRIG(8) | > + I2C_FIFO_CONTROL_RX_TRIG(1); > +out: > + i2c_writel(i2c_dev, val, reg); > +}