On Tue, 2016-12-06 at 14:57 +0700, Tin Huynh wrote: > ACPI always sets txfifo and rxfifo to 32. This configuration will > cause problem if the IP core supports a fifo size of less than 32. > The driver should read the fifo size from the IP and select the > smaller one of the two. > > Signed-off-by: Tin Huynh <tnhuynh@xxxxxxx> > The idea looks good, but see my comment below. > >dev); > + u32 param1, tx_fifo_depth, rx_fifo_depth; > struct dw_i2c_dev *dev; > struct i2c_adapter *adap; > struct resource *mem; > @@ -246,12 +247,18 @@ static int dw_i2c_plat_probe(struct > platform_device *pdev) > 1000000); > } > > + param1 = i2c_dw_read_comp_param(dev); > + tx_fifo_depth = ((param1 >> 16) & 0xff) + 1; > + rx_fifo_depth = ((param1 >> 8) & 0xff) + 1; > if (!dev->tx_fifo_depth) { > - u32 param1 = i2c_dw_read_comp_param(dev); > - > - dev->tx_fifo_depth = ((param1 >> 16) & 0xff) + 1; > - dev->rx_fifo_depth = ((param1 >> 8) & 0xff) + 1; > + dev->tx_fifo_depth = tx_fifo_depth; > + dev->rx_fifo_depth = rx_fifo_depth; > dev->adapter.nr = pdev->id; > + } else if (tx_fifo_depth) { > + dev->tx_fifo_depth = min_t(u32, dev->tx_fifo_depth, > + tx_fifo_depth > ); > + dev->rx_fifo_depth = min_t(u32, dev->rx_fifo_depth, > + rx_fifo_dept Can we move this to a separate function like static void dw_i2c_set_fifo_size(... *dev, ... id) { u32 param, tx_fifo_depth, rx_fifo_depth; param = i2c_dw_read_comp_param(dev); tx_fifo_depth = ((param >> 16) & 0xff) + 1; rx_fifo_depth = ((param >> 8) & 0xff) + 1; if (!dev->tx_fifo_depth) { dev->tx_fifo_depth = tx_fifo_depth; dev->rx_fifo_depth = rx_fifo_depth; dev->adapter.nr = id; } dev->tx_fifo_depth = min_t(u32, dev->tx_fifo_depth, tx_fifo_depth); dev->rx_fifo_depth = min_t(u32, dev->rx_fifo_depth, rx_fifo_depth); } ? -- Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> Intel Finland Oy -- To unsubscribe from this list: send the line "unsubscribe linux-i2c" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html