|
@@ -32,6 +32,14 @@ DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
|
|
#define IMX_I2C_REGSHIFT 2
|
|
|
#define VF610_I2C_REGSHIFT 0
|
|
|
+
|
|
|
+#define I2C_EARLY_INIT_INDEX 0
|
|
|
+#ifdef CONFIG_SYS_I2C_IFDR_DIV
|
|
|
+#define I2C_IFDR_DIV_CONSERVATIVE CONFIG_SYS_I2C_IFDR_DIV
|
|
|
+#else
|
|
|
+#define I2C_IFDR_DIV_CONSERVATIVE 0x7e
|
|
|
+#endif
|
|
|
+
|
|
|
/* Register index */
|
|
|
#define IADR 0
|
|
|
#define IFDR 1
|
|
@@ -659,6 +667,25 @@ void bus_i2c_init(int index, int speed, int unused,
|
|
|
bus_i2c_set_bus_speed(&mxc_i2c_buses[index], speed);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Early init I2C for prepare read the clk through I2C.
|
|
|
+ */
|
|
|
+void i2c_early_init_f(void)
|
|
|
+{
|
|
|
+ ulong base = mxc_i2c_buses[I2C_EARLY_INIT_INDEX].base;
|
|
|
+ bool quirk = mxc_i2c_buses[I2C_EARLY_INIT_INDEX].driver_data
|
|
|
+ & I2C_QUIRK_FLAG ? true : false;
|
|
|
+ int reg_shift = quirk ? VF610_I2C_REGSHIFT : IMX_I2C_REGSHIFT;
|
|
|
+
|
|
|
+ /* Set I2C divider value */
|
|
|
+ writeb(I2C_IFDR_DIV_CONSERVATIVE, base + (IFDR << reg_shift));
|
|
|
+ /* Reset module */
|
|
|
+ writeb(I2CR_IDIS, base + (I2CR << reg_shift));
|
|
|
+ writeb(0, base + (I2SR << reg_shift));
|
|
|
+ /* Enable I2C */
|
|
|
+ writeb(I2CR_IEN, base + (I2CR << reg_shift));
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Init I2C Bus
|
|
|
*/
|