summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorArmando Visconti <armando.visconti@st.com>2012-03-29 20:10:17 +0000
committerHeiko Schocher <hs@denx.de>2012-04-24 09:57:00 +0200
commit5e3e8dda51c46faedb124c0ffd6136e2ef09ae52 (patch)
tree9089a5c1e0322da753296e9147288ed27353d97d /drivers
parent031ed2fa748ccfc746bd0e0073f8690c84a0d7b6 (diff)
i2c:designware Turn off the ctrl when setting the speed
The designware i2c controller must be turned off before setting the speed in IC_CON register, as stated in the section 6.3.1 of the dw_apb_i2c_db.pdf. Signed-off-by: Michel Sanches <michel.sanches@st.com> Signed-off-by: Armando Visconti <armando.visconti@st.com> Signed-off-by: Amit Virdi <amit.virdi@st.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/i2c/designware_i2c.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/i2c/designware_i2c.c b/drivers/i2c/designware_i2c.c
index d352146081..6d118acec4 100644
--- a/drivers/i2c/designware_i2c.c
+++ b/drivers/i2c/designware_i2c.c
@@ -40,6 +40,13 @@ 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 */
+ enbl = readl(&i2c_regs_p->ic_enable);
+ enbl &= ~IC_ENABLE_0B;
+ writel(enbl, &i2c_regs_p->ic_enable);
+
cntl = (readl(&i2c_regs_p->ic_con) & (~IC_CON_SPD_MSK));
@@ -71,6 +78,10 @@ static void set_speed(int i2c_spd)
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 */
+ enbl |= IC_ENABLE_0B;
+ writel(enbl, &i2c_regs_p->ic_enable);
}
/*