]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
i2c: designware: Calculate SCL timing parameter for Fast Mode Plus
authorWan Ahmad Zainie <wan.ahmad.zainie.wan.mohamad@intel.com>
Tue, 7 Apr 2020 13:34:38 +0000 (21:34 +0800)
committerWolfram Sang <wsa@the-dreams.de>
Wed, 15 Apr 2020 11:13:33 +0000 (13:13 +0200)
Custom parameters for HCNT/LCNT are not available for OF based system.
Thus, we will use existing SCL timing parameter calculation functions
for Fast Mode Plus.

Signed-off-by: Wan Ahmad Zainie <wan.ahmad.zainie.wan.mohamad@intel.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/busses/i2c-designware-master.c

index 3a58eef20936090b997e69386f81b06ee3616d8e..23038d7272da329b772e778fe6a6af5f80952837 100644 (file)
@@ -76,14 +76,27 @@ static int i2c_dw_set_timings_master(struct dw_i2c_dev *dev)
         */
        if (t->bus_freq_hz == 1000000) {
                /*
-                * Check are fast mode plus parameters available and use
-                * fast mode if not.
+                * Check are Fast Mode Plus parameters available. Calculate
+                * SCL timing parameters for Fast Mode Plus if not set.
                 */
                if (dev->fp_hcnt && dev->fp_lcnt) {
                        dev->fs_hcnt = dev->fp_hcnt;
                        dev->fs_lcnt = dev->fp_lcnt;
-                       fp_str = " Plus";
+               } else {
+                       ic_clk = i2c_dw_clk_rate(dev);
+                       dev->fs_hcnt =
+                               i2c_dw_scl_hcnt(ic_clk,
+                                               260,    /* tHIGH = 260 ns */
+                                               sda_falling_time,
+                                               0,      /* DW default */
+                                               0);     /* No offset */
+                       dev->fs_lcnt =
+                               i2c_dw_scl_lcnt(ic_clk,
+                                               500,    /* tLOW = 500 ns */
+                                               scl_falling_time,
+                                               0);     /* No offset */
                }
+               fp_str = " Plus";
        }
        /*
         * Calculate SCL timing parameters for fast mode if not set. They are