i2c: designware_i2c: Add support for fast-plus speed
Fast-plus runs at 1MHz and is used by some devices. Add support for this. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
		
							parent
							
								
									f3d461521a
								
							
						
					
					
						commit
						d96440d1e3
					
				|  | @ -116,6 +116,13 @@ static const struct i2c_mode_info info_for_mode[] = { | ||||||
| 		300, | 		300, | ||||||
| 		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] = { | 	[IC_SPEED_MODE_HIGH] = { | ||||||
| 		I2C_SPEED_HIGH_RATE, | 		I2C_SPEED_HIGH_RATE, | ||||||
| 		MIN_HS_SCL_HIGHTIME, | 		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)) | 	    (!scl_sda_cfg || scl_sda_cfg->has_high_speed)) | ||||||
| 		i2c_spd = IC_SPEED_MODE_HIGH; | 		i2c_spd = IC_SPEED_MODE_HIGH; | ||||||
| 	else if (speed >= I2C_SPEED_FAST_RATE) | 	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; | 		i2c_spd = IC_SPEED_MODE_FAST; | ||||||
| 	else | 	else | ||||||
| 		i2c_spd = IC_SPEED_MODE_STANDARD; | 		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_hcnt, &i2c_base->ic_hs_scl_hcnt); | ||||||
| 		writel(config.scl_lcnt, &i2c_base->ic_hs_scl_lcnt); | 		writel(config.scl_lcnt, &i2c_base->ic_hs_scl_lcnt); | ||||||
| 		break; | 		break; | ||||||
| 
 |  | ||||||
| 	case IC_SPEED_MODE_STANDARD: | 	case IC_SPEED_MODE_STANDARD: | ||||||
| 		cntl |= IC_CON_SPD_SS; | 		cntl |= IC_CON_SPD_SS; | ||||||
| 		writel(config.scl_hcnt, &i2c_base->ic_ss_scl_hcnt); | 		writel(config.scl_hcnt, &i2c_base->ic_ss_scl_hcnt); | ||||||
| 		writel(config.scl_lcnt, &i2c_base->ic_ss_scl_lcnt); | 		writel(config.scl_lcnt, &i2c_base->ic_ss_scl_lcnt); | ||||||
| 		break; | 		break; | ||||||
| 
 | 	case IC_SPEED_MODE_FAST_PLUS: | ||||||
| 	case IC_SPEED_MODE_FAST: | 	case IC_SPEED_MODE_FAST: | ||||||
| 	default: | 	default: | ||||||
| 		cntl |= IC_CON_SPD_FS; | 		cntl |= IC_CON_SPD_FS; | ||||||
|  |  | ||||||
|  | @ -68,6 +68,8 @@ struct i2c_regs { | ||||||
| #define MIN_SS_SCL_LOWTIME	4700 | #define MIN_SS_SCL_LOWTIME	4700 | ||||||
| #define MIN_FS_SCL_HIGHTIME	600 | #define MIN_FS_SCL_HIGHTIME	600 | ||||||
| #define MIN_FS_SCL_LOWTIME	1300 | #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_HIGHTIME	60 | ||||||
| #define MIN_HS_SCL_LOWTIME	160 | #define MIN_HS_SCL_LOWTIME	160 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue