110 lines
3.3 KiB
Diff
110 lines
3.3 KiB
Diff
From a8f01ccff2abf680449b2e694284ecf089b5d9be Mon Sep 17 00:00:00 2001
|
|
From: Jernej Skrabec <jernej.skrabec@siol.net>
|
|
Date: Thu, 27 Apr 2017 00:03:36 +0200
|
|
Subject: [PATCH] sunxi: i2c: Add support for DM I2C
|
|
|
|
This commit adds support for DM I2C on sunxi platform. It can coexist
|
|
with old style sunxi I2C driver, because it is still used in SPL and
|
|
by some SoCs.
|
|
|
|
Because sunxi platform doesn't yet support DM clk, reset and pinctrl
|
|
driver, workaround is needed to enable clocks and set resets and
|
|
pinctrls. This is done by calling i2c_init_board() in board_init().
|
|
This means that CONFIG_I2Cx_ENABLE options needs to be correctly set
|
|
in order to use needed I2C controller.
|
|
|
|
Commit is based on the previous patch made by Philipp Tomsich
|
|
|
|
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
|
|
Reviewed-by: Heiko Schocher <hs@denx.de>
|
|
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
|
|
---
|
|
arch/arm/mach-sunxi/board.c | 2 ++
|
|
board/sunxi/board.c | 8 ++++++++
|
|
drivers/i2c/mvtwsi.c | 9 +++++++++
|
|
include/configs/sunxi-common.h | 4 +++-
|
|
4 files changed, 22 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/arch/arm/mach-sunxi/board.c b/arch/arm/mach-sunxi/board.c
|
|
index 4507279..65b1ebd 100644
|
|
--- a/arch/arm/mach-sunxi/board.c
|
|
+++ b/arch/arm/mach-sunxi/board.c
|
|
@@ -204,7 +204,9 @@ void s_init(void)
|
|
clock_init();
|
|
timer_init();
|
|
gpio_init();
|
|
+#ifndef CONFIG_DM_I2C
|
|
i2c_init_board();
|
|
+#endif
|
|
eth_init_board();
|
|
}
|
|
|
|
diff --git a/board/sunxi/board.c b/board/sunxi/board.c
|
|
index f903a5d..01de42d 100644
|
|
--- a/board/sunxi/board.c
|
|
+++ b/board/sunxi/board.c
|
|
@@ -222,6 +222,14 @@ int board_init(void)
|
|
gpio_direction_output(macpwr_pin, 1);
|
|
#endif
|
|
|
|
+#ifdef CONFIG_DM_I2C
|
|
+ /*
|
|
+ * Temporary workaround for enabling I2C clocks until proper sunxi DM
|
|
+ * clk, reset and pinctrl drivers land.
|
|
+ */
|
|
+ i2c_init_board();
|
|
+#endif
|
|
+
|
|
/* Uses dm gpio code so do this here and not in i2c_init_board() */
|
|
return soft_i2c_board_init();
|
|
}
|
|
diff --git a/drivers/i2c/mvtwsi.c b/drivers/i2c/mvtwsi.c
|
|
index 648a96e..3703519 100644
|
|
--- a/drivers/i2c/mvtwsi.c
|
|
+++ b/drivers/i2c/mvtwsi.c
|
|
@@ -37,6 +37,14 @@ DECLARE_GLOBAL_DATA_PTR;
|
|
#endif /* CONFIG_DM_I2C */
|
|
|
|
/*
|
|
+ * On SUNXI, we get CONFIG_SYS_TCLK from this include, so we want to
|
|
+ * always have it.
|
|
+ */
|
|
+#if defined(CONFIG_DM_I2C) && defined(CONFIG_ARCH_SUNXI)
|
|
+#include <asm/arch/i2c.h>
|
|
+#endif
|
|
+
|
|
+/*
|
|
* TWSI register structure
|
|
*/
|
|
|
|
@@ -831,6 +839,7 @@ static const struct dm_i2c_ops mvtwsi_i2c_ops = {
|
|
static const struct udevice_id mvtwsi_i2c_ids[] = {
|
|
{ .compatible = "marvell,mv64xxx-i2c", },
|
|
{ .compatible = "marvell,mv78230-i2c", },
|
|
+ { .compatible = "allwinner,sun6i-a31-i2c", },
|
|
{ /* sentinel */ }
|
|
};
|
|
|
|
diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h
|
|
index 64a1900..b794e42 100644
|
|
--- a/include/configs/sunxi-common.h
|
|
+++ b/include/configs/sunxi-common.h
|
|
@@ -211,11 +211,13 @@
|
|
#if defined CONFIG_I2C0_ENABLE || defined CONFIG_I2C1_ENABLE || \
|
|
defined CONFIG_I2C2_ENABLE || defined CONFIG_I2C3_ENABLE || \
|
|
defined CONFIG_I2C4_ENABLE || defined CONFIG_R_I2C_ENABLE
|
|
-#define CONFIG_SYS_I2C
|
|
#define CONFIG_SYS_I2C_MVTWSI
|
|
+#ifndef CONFIG_DM_I2C
|
|
+#define CONFIG_SYS_I2C
|
|
#define CONFIG_SYS_I2C_SPEED 400000
|
|
#define CONFIG_SYS_I2C_SLAVE 0x7f
|
|
#endif
|
|
+#endif
|
|
|
|
#if defined CONFIG_VIDEO_LCD_PANEL_I2C && !(defined CONFIG_SPL_BUILD)
|
|
#define CONFIG_SYS_I2C_SOFT
|
|
--
|
|
1.7.10.4
|
|
|