diff options
| author | Armando Visconti <armando.visconti@st.com> | 2012-12-06 00:04:17 +0000 | 
|---|---|---|
| committer | Tom Rini <trini@ti.com> | 2012-12-11 13:17:32 -0700 | 
| commit | 5b8439bbdea9ad8c120cda408a97ed2e55e943d3 (patch) | |
| tree | d780361247639c2ca75ac5d1340cec315c466b04 /drivers/i2c | |
| parent | 491739bb7456b95bb863421f6cd76af0ff9b797c (diff) | |
| download | olio-uboot-2014.01-5b8439bbdea9ad8c120cda408a97ed2e55e943d3.tar.xz olio-uboot-2014.01-5b8439bbdea9ad8c120cda408a97ed2e55e943d3.zip | |
designware_i2c: Fixed the setting of the i2c bus speed
There are three couple (hcnt/lcnt) of registers for each
speed (SS/FS/HS). The driver needs to set the proper couple
of regs according to what speed we are setting.
Signed-off-by: Armando Visconti <armando.visconti@st.com>
Diffstat (limited to 'drivers/i2c')
| -rw-r--r-- | drivers/i2c/designware_i2c.c | 28 | 
1 files changed, 13 insertions, 15 deletions
| diff --git a/drivers/i2c/designware_i2c.c b/drivers/i2c/designware_i2c.c index eab313102..665387091 100644 --- a/drivers/i2c/designware_i2c.c +++ b/drivers/i2c/designware_i2c.c @@ -44,7 +44,6 @@ static void set_speed(int i2c_spd)  {  	unsigned int cntl;  	unsigned int hcnt, lcnt; -	unsigned int high, low;  	unsigned int enbl;  	/* to set speed cltr must be disabled */ @@ -52,39 +51,38 @@ static void set_speed(int i2c_spd)  	enbl &= ~IC_ENABLE_0B;  	writel(enbl, &i2c_regs_p->ic_enable); -  	cntl = (readl(&i2c_regs_p->ic_con) & (~IC_CON_SPD_MSK));  	switch (i2c_spd) {  	case IC_SPEED_MODE_MAX:  		cntl |= IC_CON_SPD_HS; -		high = MIN_HS_SCL_HIGHTIME; -		low = MIN_HS_SCL_LOWTIME; +		hcnt = (IC_CLK * MIN_HS_SCL_HIGHTIME) / NANO_TO_MICRO; +		writel(hcnt, &i2c_regs_p->ic_hs_scl_hcnt); +		lcnt = (IC_CLK * MIN_HS_SCL_LOWTIME) / NANO_TO_MICRO; +		writel(lcnt, &i2c_regs_p->ic_hs_scl_lcnt);  		break;  	case IC_SPEED_MODE_STANDARD:  		cntl |= IC_CON_SPD_SS; -		high = MIN_SS_SCL_HIGHTIME; -		low = MIN_SS_SCL_LOWTIME; +		hcnt = (IC_CLK * MIN_SS_SCL_HIGHTIME) / NANO_TO_MICRO; +		writel(hcnt, &i2c_regs_p->ic_ss_scl_hcnt); +		lcnt = (IC_CLK * MIN_SS_SCL_LOWTIME) / NANO_TO_MICRO; +		writel(lcnt, &i2c_regs_p->ic_ss_scl_lcnt);  		break;  	case IC_SPEED_MODE_FAST:  	default:  		cntl |= IC_CON_SPD_FS; -		high = MIN_FS_SCL_HIGHTIME; -		low = MIN_FS_SCL_LOWTIME; +		hcnt = (IC_CLK * MIN_FS_SCL_HIGHTIME) / NANO_TO_MICRO; +		writel(hcnt, &i2c_regs_p->ic_fs_scl_hcnt); +		lcnt = (IC_CLK * MIN_FS_SCL_LOWTIME) / NANO_TO_MICRO; +		writel(lcnt, &i2c_regs_p->ic_fs_scl_lcnt);  		break;  	}  	writel(cntl, &i2c_regs_p->ic_con); -	hcnt = (IC_CLK * high) / NANO_TO_MICRO; -	writel(hcnt, &i2c_regs_p->ic_fs_scl_hcnt); - -	lcnt = (IC_CLK * low) / NANO_TO_MICRO; -	writel(lcnt, &i2c_regs_p->ic_fs_scl_lcnt); - -	/* re-enable i2c ctrl back now that speed is set */ +	/* Enable back i2c now speed set */  	enbl |= IC_ENABLE_0B;  	writel(enbl, &i2c_regs_p->ic_enable);  } |