diff mbox

[U-Boot,3/4] sunxi: i2c: Add support for DM I2C

Message ID 20170426220337.13136-4-jernej.skrabec@siol.net
State Accepted
Commit a8f01ccff2abf680449b2e694284ecf089b5d9be
Delegated to: Heiko Schocher
Headers show

Commit Message

Jernej Škrabec April 26, 2017, 10:03 p.m. UTC
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>
---

 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(-)

Comments

Heiko Schocher April 28, 2017, 3:43 a.m. UTC | #1
Hello Jernej,

Am 27.04.2017 um 00:03 schrieb Jernej Skrabec:
> 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>
> ---
>
>   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(-)

Reviewed-by: Heiko Schocher <hs@denx.de>

bye,
Heiko
>
> diff --git a/arch/arm/mach-sunxi/board.c b/arch/arm/mach-sunxi/board.c
> index 4507279cc5..65b1ebd837 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 f903a5d0a0..01de42d031 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 648a96eeb4..3703519aa5 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 a56b45fa2f..997a92c8be 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
>
Simon Glass April 29, 2017, 12:28 a.m. UTC | #2
On 26 April 2017 at 16:03, Jernej Skrabec <jernej.skrabec@siol.net> wrote:
> 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>
> ---
>
>  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(-)

Acked-by: Simon Glass <sjg@chromium.org>
diff mbox

Patch

diff --git a/arch/arm/mach-sunxi/board.c b/arch/arm/mach-sunxi/board.c
index 4507279cc5..65b1ebd837 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 f903a5d0a0..01de42d031 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 648a96eeb4..3703519aa5 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 a56b45fa2f..997a92c8be 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