i2c: designware_i2c: Add support for fast-plus speed
authorSimon Glass <sjg@chromium.org>
Thu, 23 Jan 2020 18:48:23 +0000 (11:48 -0700)
committerHeiko Schocher <hs@denx.de>
Mon, 27 Jan 2020 06:24:17 +0000 (07:24 +0100)
Fast-plus runs at 1MHz and is used by some devices. Add support for this.

Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/i2c/designware_i2c.c
drivers/i2c/designware_i2c.h

index 1f41e3e..d9e0d81 100644 (file)
@@ -116,6 +116,13 @@ static const struct i2c_mode_info info_for_mode[] = {
                300,
                300,
        },
+       [IC_SPEED_MODE_FAST_PLUS] = {
+               I2C_SPEED_FAST_PLUS_RATE,
+               MIN_FP_SCL_HIGHTIME,
+               MIN_FP_SCL_LOWTIME,
+               260,
+               500,
+       },
        [IC_SPEED_MODE_HIGH] = {
                I2C_SPEED_HIGH_RATE,
                MIN_HS_SCL_HIGHTIME,
@@ -230,6 +237,8 @@ static unsigned int __dw_i2c_set_bus_speed(struct dw_i2c *priv,
            (!scl_sda_cfg || scl_sda_cfg->has_high_speed))
                i2c_spd = IC_SPEED_MODE_HIGH;
        else if (speed >= I2C_SPEED_FAST_RATE)
+               i2c_spd = IC_SPEED_MODE_FAST_PLUS;
+       else if (speed >= I2C_SPEED_FAST_PLUS_RATE)
                i2c_spd = IC_SPEED_MODE_FAST;
        else
                i2c_spd = IC_SPEED_MODE_STANDARD;
@@ -271,13 +280,12 @@ static unsigned int __dw_i2c_set_bus_speed(struct dw_i2c *priv,
                writel(config.scl_hcnt, &i2c_base->ic_hs_scl_hcnt);
                writel(config.scl_lcnt, &i2c_base->ic_hs_scl_lcnt);
                break;
-
        case IC_SPEED_MODE_STANDARD:
                cntl |= IC_CON_SPD_SS;
                writel(config.scl_hcnt, &i2c_base->ic_ss_scl_hcnt);
                writel(config.scl_lcnt, &i2c_base->ic_ss_scl_lcnt);
                break;
-
+       case IC_SPEED_MODE_FAST_PLUS:
        case IC_SPEED_MODE_FAST:
        default:
                cntl |= IC_CON_SPD_FS;
index 5289ab0..3db63b5 100644 (file)
@@ -68,6 +68,8 @@ struct i2c_regs {
 #define MIN_SS_SCL_LOWTIME     4700
 #define MIN_FS_SCL_HIGHTIME    600
 #define MIN_FS_SCL_LOWTIME     1300
+#define MIN_FP_SCL_HIGHTIME    260
+#define MIN_FP_SCL_LOWTIME     500
 #define MIN_HS_SCL_HIGHTIME    60
 #define MIN_HS_SCL_LOWTIME     160