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);
> +}

Reply via email to