i2c:designware Turn off the ctrl when setting the speed
authorArmando Visconti <armando.visconti@st.com>
Thu, 29 Mar 2012 20:10:17 +0000 (20:10 +0000)
committerHeiko Schocher <hs@denx.de>
Tue, 24 Apr 2012 07:57:00 +0000 (09:57 +0200)
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>
drivers/i2c/designware_i2c.c

index d3521460819526c5d0f917d3ade02f8933a7eb43..6d118acec439974eecc8e45ea79b01f5d1cc56d0 100644 (file)
@@ -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);
 }
 
 /*