[U-Boot] [PATCH 3/9] kmp204x: I2C deblocking for I2C-bus1 added
Valentin Longchamp
valentin.longchamp at keymile.com
Mon Jan 13 17:29:11 CET 2014
From: Rainer Boschung <rainer.boschung at keymile.com>
-uses common deblocking algorithm from ../common/common.c
-supports deblocking of of I2C-bus1 by means of QRIO GPIO
- SCL1 = GPIO_A16
- SDA1 = GPIO_A17
QRIO GPIOs act in an open-drain-like manner, for 0 GPIO drives
low and for 1 the GPIO is an input and must be pulled up externaly!
Signed-off-by: Rainer Boschung <rainer.boschung at keymile.com>
Signed-off-by: Valentin Longchamp <valentin.longchamp at keymile.com>
Acked-by: Valentin Longchamp <valentin.longchamp at keymile.com>
---
board/keymile/kmp204x/kmp204x.c | 53 ++++++++++++++++++++++++++++++++++---
include/configs/km/kmp204x-common.h | 10 +++++++
2 files changed, 60 insertions(+), 3 deletions(-)
diff --git a/board/keymile/kmp204x/kmp204x.c b/board/keymile/kmp204x/kmp204x.c
index dae5378..141d7ee 100644
--- a/board/keymile/kmp204x/kmp204x.c
+++ b/board/keymile/kmp204x/kmp204x.c
@@ -33,12 +33,51 @@ int checkboard(void)
return 0;
}
-/* TODO: implement the I2C deblocking function */
-int i2c_make_abort(void)
+/* I2C deblocking uses the algorithm defined in ../common/common.c, which
+ * makes use of 2 QRIO GPIOs to act on the SCL and SDA signals of an I2C bus.
+ * According to the standard I2C IOs must not drive HI-Levels, so the
+ * QRIO GPIOs are used in open-drain fashion:
+ * -> 0 GPIO configured as output that drives low
+ * -> 1 GPIO configured as input pull-up ties high
+ */
+
+/* GPIOs used for deblocking I2C bus 1 */
+#define DBLK_PORT1 GPIO_A
+#define DBLK_SCL1 16
+#define DBLK_SDA1 17
+
+/* By default deblock GPIOs are floating */
+static void i2c_deblock_gpio_cfg(void)
+{
+ /* set I2C bus 1 deblocking GPIOs input, but 0 value for open drain */
+ qrio_gpio_direction_input(DBLK_PORT1, DBLK_SCL1);
+ qrio_gpio_direction_input(DBLK_PORT1, DBLK_SDA1);
+
+ qrio_set_gpio(DBLK_PORT1, DBLK_SCL1, 0);
+ qrio_set_gpio(DBLK_PORT1, DBLK_SDA1, 0);
+}
+
+void set_sda(int state)
+{
+ qrio_set_opendrain_gpio(DBLK_PORT1, DBLK_SDA1, state);
+}
+
+void set_scl(int state)
+{
+ qrio_set_opendrain_gpio(DBLK_PORT1, DBLK_SCL1, state);
+}
+
+int get_sda(void)
+{
+ return qrio_get_gpio(DBLK_PORT1, DBLK_SDA1);
+}
+
+int get_scl(void)
{
- return 1;
+ return qrio_get_gpio(DBLK_PORT1, DBLK_SCL1);
}
+
#define ZL30158_RST 8
#define ZL30343_RST 9
@@ -77,6 +116,14 @@ unsigned long get_board_sys_clk(unsigned long dummy)
return 66666666;
}
+int misc_init_f(void)
+{
+ /* configure QRIO pis for i2c deblocking */
+ i2c_deblock_gpio_cfg();
+
+ return 0;
+}
+
#define BOOTCOUNT_OFF 0x20
void bootcount_store(ulong counter)
diff --git a/include/configs/km/kmp204x-common.h b/include/configs/km/kmp204x-common.h
index 50330cc..b4242e5 100644
--- a/include/configs/km/kmp204x-common.h
+++ b/include/configs/km/kmp204x-common.h
@@ -209,6 +209,7 @@ unsigned long get_board_sys_clk(unsigned long dummy);
#define CONFIG_BOARD_EARLY_INIT_F
#define CONFIG_BOARD_EARLY_INIT_R /* call board_early_init_r function */
+#define CONFIG_MISC_INIT_F
#define CONFIG_MISC_INIT_R
#define CONFIG_LAST_STAGE_INIT
@@ -264,7 +265,10 @@ unsigned long get_board_sys_clk(unsigned long dummy);
#define CONFIG_FIT_VERBOSE /* enable fit_format_{error,warning}() */
/* I2C */
+
#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_INIT_BOARD
+#define CONFIG_SYS_I2C_SPEED 100000 /* deblocking */
#define CONFIG_SYS_NUM_I2C_BUSES 3
#define CONFIG_SYS_I2C_MAX_HOPS 1
#define CONFIG_SYS_I2C_FSL /* Use FSL I2C driver */
@@ -277,6 +281,12 @@ unsigned long get_board_sys_clk(unsigned long dummy);
{0, {{I2C_MUX_PCA9547, 0x70, 1 } } }, \
{0, {{I2C_MUX_PCA9547, 0x70, 2 } } }, \
}
+#ifndef __ASSEMBLY__
+void set_sda(int state);
+void set_scl(int state);
+int get_sda(void);
+int get_scl(void);
+#endif
#define CONFIG_KM_IVM_BUS 1 /* I2C1 (Mux-Port 1)*/
--
1.8.0.1
More information about the U-Boot
mailing list