On 25/07/2018 17:39:30+0300, Andy Shevchenko wrote: > Instead of using custom variables and parser, convert the driver to use > the ones provided by I2C core. > > No functional change intended. > > Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> Acked-by: Alexandre Belloni <alexandre.belloni@xxxxxxxxxxx> Tested-by: Alexandre Belloni <alexandre.belloni@xxxxxxxxxxx> > --- > drivers/i2c/busses/i2c-at91.c | 24 ++++++++---------------- > 1 file changed, 8 insertions(+), 16 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c > index 3f3e8b3bf5ff..c83caa383cd2 100644 > --- a/drivers/i2c/busses/i2c-at91.c > +++ b/drivers/i2c/busses/i2c-at91.c > @@ -34,7 +34,6 @@ > #include <linux/pm_runtime.h> > #include <linux/pinctrl/consumer.h> > > -#define DEFAULT_TWI_CLK_HZ 100000 /* max 400 Kbits/s */ > #define AT91_I2C_TIMEOUT msecs_to_jiffies(100) /* transfer timeout */ > #define AT91_I2C_DMA_THRESHOLD 8 /* enable DMA if transfer size is bigger than this threshold */ > #define AUTOSUSPEND_TIMEOUT 2000 > @@ -190,16 +189,18 @@ static void at91_init_twi_bus(struct at91_twi_dev *dev) > * Calculate symmetric clock as stated in datasheet: > * twi_clk = F_MAIN / (2 * (cdiv * (1 << ckdiv) + offset)) > */ > -static void at91_calc_twi_clock(struct at91_twi_dev *dev, int twi_clk) > +static void at91_calc_twi_clock(struct at91_twi_dev *dev) > { > int ckdiv, cdiv, div, hold = 0; > struct at91_twi_pdata *pdata = dev->pdata; > int offset = pdata->clk_offset; > int max_ckdiv = pdata->clk_max_div; > - u32 twd_hold_time_ns = 0; > + struct i2c_timings timings, *t = &timings; > + > + i2c_parse_fw_timings(dev->dev, t, true); > > div = max(0, (int)DIV_ROUND_UP(clk_get_rate(dev->clk), > - 2 * twi_clk) - offset); > + 2 * t->bus_freq_hz) - offset); > ckdiv = fls(div >> 8); > cdiv = div >> ckdiv; > > @@ -211,15 +212,12 @@ static void at91_calc_twi_clock(struct at91_twi_dev *dev, int twi_clk) > } > > if (pdata->has_hold_field) { > - of_property_read_u32(dev->dev->of_node, "i2c-sda-hold-time-ns", > - &twd_hold_time_ns); > - > /* > * hold time = HOLD + 3 x T_peripheral_clock > * Use clk rate in kHz to prevent overflows when computing > * hold. > */ > - hold = DIV_ROUND_UP(twd_hold_time_ns > + hold = DIV_ROUND_UP(t->sda_hold_ns > * (clk_get_rate(dev->clk) / 1000), 1000000); > hold -= 3; > if (hold < 0) > @@ -236,7 +234,7 @@ static void at91_calc_twi_clock(struct at91_twi_dev *dev, int twi_clk) > | AT91_TWI_CWGR_HOLD(hold); > > dev_dbg(dev->dev, "cdiv %d ckdiv %d hold %d (%d ns)\n", > - cdiv, ckdiv, hold, twd_hold_time_ns); > + cdiv, ckdiv, hold, t->sda_hold_ns); > } > > static void at91_twi_dma_cleanup(struct at91_twi_dev *dev) > @@ -1052,7 +1050,6 @@ static int at91_twi_probe(struct platform_device *pdev) > struct resource *mem; > int rc; > u32 phy_addr; > - u32 bus_clk_rate; > > dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); > if (!dev) > @@ -1108,12 +1105,7 @@ static int at91_twi_probe(struct platform_device *pdev) > dev_info(dev->dev, "Using FIFO (%u data)\n", dev->fifo_size); > } > > - rc = of_property_read_u32(dev->dev->of_node, "clock-frequency", > - &bus_clk_rate); > - if (rc) > - bus_clk_rate = DEFAULT_TWI_CLK_HZ; > - > - at91_calc_twi_clock(dev, bus_clk_rate); > + at91_calc_twi_clock(dev); > at91_init_twi_bus(dev); > > snprintf(dev->adapter.name, sizeof(dev->adapter.name), "AT91"); > -- > 2.18.0 > -- Alexandre Belloni, Bootlin (formerly Free Electrons) Embedded Linux and Kernel engineering https://bootlin.com