|
@@ -433,12 +433,11 @@ static void rk3x_i2c_set_scl_rate(struct rk3x_i2c *i2c, unsigned long scl_rate)
|
|
unsigned long i2c_rate = clk_get_rate(i2c->clk);
|
|
unsigned long i2c_rate = clk_get_rate(i2c->clk);
|
|
unsigned int div;
|
|
unsigned int div;
|
|
|
|
|
|
- /* SCL rate = (clk rate) / (8 * DIV) */
|
|
|
|
- div = DIV_ROUND_UP(i2c_rate, scl_rate * 8);
|
|
|
|
-
|
|
|
|
- /* The lower and upper half of the CLKDIV reg describe the length of
|
|
|
|
- * SCL low & high periods. */
|
|
|
|
- div = DIV_ROUND_UP(div, 2);
|
|
|
|
|
|
+ /* set DIV = DIVH = DIVL
|
|
|
|
+ * SCL rate = (clk rate) / (8 * (DIVH + 1 + DIVL + 1))
|
|
|
|
+ * = (clk rate) / (16 * (DIV + 1))
|
|
|
|
+ */
|
|
|
|
+ div = DIV_ROUND_UP(i2c_rate, scl_rate * 16) - 1;
|
|
|
|
|
|
i2c_writel(i2c, (div << 16) | (div & 0xffff), REG_CLKDIV);
|
|
i2c_writel(i2c, (div << 16) | (div & 0xffff), REG_CLKDIV);
|
|
}
|
|
}
|