Patchwork [U-Boot,v4,1/2] i2c:soft:multi: Support for multiple soft I2C buses at Samsung boards

login
register
mail settings
Submitter Łukasz Majewski
Date Sept. 5, 2012, 9:15 a.m.
Message ID <1346836521-15269-2-git-send-email-l.majewski@samsung.com>
Download mbox | patch
Permalink /patch/181789/
State Accepted
Commit 7ca8f73a0ad9176e6e45190a3490bbeb3d80e018
Delegated to: Heiko Schocher
Headers show

Comments

Łukasz Majewski - Sept. 5, 2012, 9:15 a.m.
Support for multiple soft I2C buses.

Multibus I2C support is achieved by defining get_multi_{sda|scl}_pin
functions to switch between multiple "soft" I2C buses.

Common definition of I2C_X I2C buses is provided at <i2c.h>.

TEST HW:
     Samsung's Exynos4210 evt.0.1 - Trats development board

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Heiko Schocher <hs@denx.de>
Cc: Minkyu Kang <mk7.kang@samsung.com>

---
Changes for v2:
- Common Samsung code has been put to board/samsung/common/multi_i2c.c file
- I2C_{4|5} have been renamed to I2C_{0|1}
- *soft_i2c_name[] table has been removed
Changes for v3:
- None
Changes for v4:
- Common definitions of available I2C buses are now defined at <i2c.h>
- Compatibility layer (I2C_0) has been added temporarily to not break the Trats
  I2C communication with PMIC. It will be removed when redesigned PMIC will be
  posted
---
 board/samsung/common/Makefile    |   43 +++++++++++++++++++++++++
 board/samsung/common/multi_i2c.c |   65 ++++++++++++++++++++++++++++++++++++++
 include/i2c.h                    |   12 +++++++
 3 files changed, 120 insertions(+), 0 deletions(-)
 create mode 100644 board/samsung/common/Makefile
 create mode 100644 board/samsung/common/multi_i2c.c
Heiko Schocher - Sept. 6, 2012, 3:49 a.m.
Hello Lukasz,

On 05.09.2012 11:15, Lukasz Majewski wrote:
> Support for multiple soft I2C buses.
>
> Multibus I2C support is achieved by defining get_multi_{sda|scl}_pin
> functions to switch between multiple "soft" I2C buses.
>
> Common definition of I2C_X I2C buses is provided at<i2c.h>.
>
> TEST HW:
>       Samsung's Exynos4210 evt.0.1 - Trats development board
>
> Signed-off-by: Lukasz Majewski<l.majewski@samsung.com>
> Signed-off-by: Kyungmin Park<kyungmin.park@samsung.com>
> Cc: Heiko Schocher<hs@denx.de>
> Cc: Minkyu Kang<mk7.kang@samsung.com>
>
> ---
> Changes for v2:
> - Common Samsung code has been put to board/samsung/common/multi_i2c.c file
> - I2C_{4|5} have been renamed to I2C_{0|1}
> - *soft_i2c_name[] table has been removed
> Changes for v3:
> - None
> Changes for v4:
> - Common definitions of available I2C buses are now defined at<i2c.h>
> - Compatibility layer (I2C_0) has been added temporarily to not break the Trats
>    I2C communication with PMIC. It will be removed when redesigned PMIC will be
>    posted
> ---
>   board/samsung/common/Makefile    |   43 +++++++++++++++++++++++++
>   board/samsung/common/multi_i2c.c |   65 ++++++++++++++++++++++++++++++++++++++
>   include/i2c.h                    |   12 +++++++
>   3 files changed, 120 insertions(+), 0 deletions(-)
>   create mode 100644 board/samsung/common/Makefile
>   create mode 100644 board/samsung/common/multi_i2c.c
>
[...]
> +#########################################################################
> diff --git a/board/samsung/common/multi_i2c.c b/board/samsung/common/multi_i2c.c
> new file mode 100644
> index 0000000..d6c3d37
> --- /dev/null
> +++ b/board/samsung/common/multi_i2c.c
> @@ -0,0 +1,65 @@
[...]
> +/* Handle multiple I2C buses instances */
> +int get_multi_scl_pin(void)
> +{
> +	unsigned int bus = I2C_GET_BUS();
> +
> +	switch (bus) {
> +	case I2C_0: /* I2C_0 definition - compatibility layer */
> +	case I2C_5:

Is this correct, that you want to use 2 i2c busses on the same pin?

Beside of that, you get my:

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

bye,
Heiko
Łukasz Majewski - Sept. 6, 2012, 8:12 a.m.
Hi Heiko,

Thanks for comments.

> Hello Lukasz,
> 
> On 05.09.2012 11:15, Lukasz Majewski wrote:
> > Support for multiple soft I2C buses.
> >
> > Multibus I2C support is achieved by defining get_multi_{sda|scl}_pin
> > functions to switch between multiple "soft" I2C buses.
> >
> > Common definition of I2C_X I2C buses is provided at<i2c.h>.
> >
> > TEST HW:
> >       Samsung's Exynos4210 evt.0.1 - Trats development board
> >
> > Signed-off-by: Lukasz Majewski<l.majewski@samsung.com>
> > Signed-off-by: Kyungmin Park<kyungmin.park@samsung.com>
> > Cc: Heiko Schocher<hs@denx.de>
> > Cc: Minkyu Kang<mk7.kang@samsung.com>
> >
> > ---
> > Changes for v2:
> > - Common Samsung code has been put to
> > board/samsung/common/multi_i2c.c file
> > - I2C_{4|5} have been renamed to I2C_{0|1}
> > - *soft_i2c_name[] table has been removed
> > Changes for v3:
> > - None
> > Changes for v4:
> > - Common definitions of available I2C buses are now defined
> > at<i2c.h>
> > - Compatibility layer (I2C_0) has been added temporarily to not
> > break the Trats I2C communication with PMIC. It will be removed
> > when redesigned PMIC will be posted
> > ---
> >   board/samsung/common/Makefile    |   43 +++++++++++++++++++++++++
> >   board/samsung/common/multi_i2c.c |   65
> > ++++++++++++++++++++++++++++++++++++++
> > include/i2c.h                    |   12 +++++++ 3 files changed,
> > 120 insertions(+), 0 deletions(-) create mode 100644
> > board/samsung/common/Makefile create mode 100644
> > board/samsung/common/multi_i2c.c
> >
> [...]
> > +#########################################################################
> > diff --git a/board/samsung/common/multi_i2c.c
> > b/board/samsung/common/multi_i2c.c new file mode 100644
> > index 0000000..d6c3d37
> > --- /dev/null
> > +++ b/board/samsung/common/multi_i2c.c
> > @@ -0,0 +1,65 @@
> [...]
> > +/* Handle multiple I2C buses instances */
> > +int get_multi_scl_pin(void)
> > +{
> > +	unsigned int bus = I2C_GET_BUS();
> > +
> > +	switch (bus) {
> > +	case I2C_0: /* I2C_0 definition - compatibility layer */
> > +	case I2C_5:
> 
> Is this correct, that you want to use 2 i2c busses on the same pin?

Yes, this is correct.

Let me share with you the "master" plan for this.
The I2C_0 is needed to keep the TRATS working with current PMIC
implementation. 

I'm working on redesign of current PMIC implementation to support other
devices responsible for power management (e.g. fuel gauge, charger,
PMIC), which in case of TRATS are connected via multiple I2C buses
(I2C_5 and I2C_9).

The I2C_0 case is for preserving correct operation of TRATS board until
PMIC 2.0 wont be introduced to u-boot mailing list. 

It will be removed just after PMIC 2.0 acceptance.

I hope, that I've expressed my intentions clearly.

> 
> Beside of that, you get my:
> 
> Acked-by: Heiko Schocher <hs@denx.de>
> 
> bye,
> Heiko
Łukasz Majewski - Sept. 12, 2012, 7:06 a.m.
Hi Minkyu,

> Support for multiple soft I2C buses.
> 
> Multibus I2C support is achieved by defining get_multi_{sda|scl}_pin
> functions to switch between multiple "soft" I2C buses.
> 
> Common definition of I2C_X I2C buses is provided at <i2c.h>.
> 
> TEST HW:
>      Samsung's Exynos4210 evt.0.1 - Trats development board
> 
> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
> Cc: Heiko Schocher <hs@denx.de>
> Cc: Minkyu Kang <mk7.kang@samsung.com>
> 
> ---
> Changes for v2:
> - Common Samsung code has been put to
> board/samsung/common/multi_i2c.c file
> - I2C_{4|5} have been renamed to I2C_{0|1}
> - *soft_i2c_name[] table has been removed
> Changes for v3:
> - None
> Changes for v4:
> - Common definitions of available I2C buses are now defined at <i2c.h>
> - Compatibility layer (I2C_0) has been added temporarily to not break
> the Trats I2C communication with PMIC. It will be removed when
> redesigned PMIC will be posted
> ---

Can you evaluate those patches.

Those were acked-by Heiko already.
Minkyu Kang - Sept. 12, 2012, 7:43 a.m.
Dear Lukasz,

On 12 September 2012 16:06, Lukasz Majewski <l.majewski@samsung.com> wrote:
> Hi Minkyu,
>
>> Support for multiple soft I2C buses.
>>
>> Multibus I2C support is achieved by defining get_multi_{sda|scl}_pin
>> functions to switch between multiple "soft" I2C buses.
>>
>> Common definition of I2C_X I2C buses is provided at <i2c.h>.
>>
>> TEST HW:
>>      Samsung's Exynos4210 evt.0.1 - Trats development board
>>
>> Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
>> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
>> Cc: Heiko Schocher <hs@denx.de>
>> Cc: Minkyu Kang <mk7.kang@samsung.com>
>>
>> ---
>> Changes for v2:
>> - Common Samsung code has been put to
>> board/samsung/common/multi_i2c.c file
>> - I2C_{4|5} have been renamed to I2C_{0|1}
>> - *soft_i2c_name[] table has been removed
>> Changes for v3:
>> - None
>> Changes for v4:
>> - Common definitions of available I2C buses are now defined at <i2c.h>
>> - Compatibility layer (I2C_0) has been added temporarily to not break
>> the Trats I2C communication with PMIC. It will be removed when
>> redesigned PMIC will be posted
>> ---
>
> Can you evaluate those patches.
>
> Those were acked-by Heiko already.
>

OK.
please wait few days.
I will check pending patches soon.

Thanks.
Minkyu Kang.

Patch

diff --git a/board/samsung/common/Makefile b/board/samsung/common/Makefile
new file mode 100644
index 0000000..0bcd594
--- /dev/null
+++ b/board/samsung/common/Makefile
@@ -0,0 +1,43 @@ 
+#
+# Copyright (C) 2012 Samsung Electronics
+# Lukasz Majewski <l.majewski@samsung.com>
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+include $(TOPDIR)/config.mk
+
+LIB	= $(obj)libsamsung.o
+
+COBJS-$(CONFIG_SOFT_I2C_MULTI_BUS) += multi_i2c.o
+
+SRCS    := $(COBJS-y:.o=.c)
+OBJS	:= $(addprefix $(obj),$(COBJS-y))
+
+$(LIB):	$(obj).depend $(OBJS)
+	$(call cmd_link_o_target, $(OBJS))
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/samsung/common/multi_i2c.c b/board/samsung/common/multi_i2c.c
new file mode 100644
index 0000000..d6c3d37
--- /dev/null
+++ b/board/samsung/common/multi_i2c.c
@@ -0,0 +1,65 @@ 
+/*
+ *  Copyright (C) 2012 Samsung Electronics
+ *  Lukasz Majewski <l.majewski@samsung.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <i2c.h>
+
+/* Handle multiple I2C buses instances */
+int get_multi_scl_pin(void)
+{
+	unsigned int bus = I2C_GET_BUS();
+
+	switch (bus) {
+	case I2C_0: /* I2C_0 definition - compatibility layer */
+	case I2C_5:
+		return CONFIG_SOFT_I2C_I2C5_SCL;
+	case I2C_9:
+		return CONFIG_SOFT_I2C_I2C9_SCL;
+	default:
+		printf("I2C_%d not supported!\n", bus);
+	};
+
+	return 0;
+}
+
+int get_multi_sda_pin(void)
+{
+	unsigned int bus = I2C_GET_BUS();
+
+	switch (bus) {
+	case I2C_0: /* I2C_0 definition - compatibility layer */
+	case I2C_5:
+		return CONFIG_SOFT_I2C_I2C5_SDA;
+	case I2C_9:
+		return CONFIG_SOFT_I2C_I2C9_SDA;
+	default:
+		printf("I2C_%d not supported!\n", bus);
+	};
+
+	return 0;
+}
+
+int multi_i2c_init(void)
+{
+	return 0;
+}
diff --git a/include/i2c.h b/include/i2c.h
index 1f35acf..16f099d 100644
--- a/include/i2c.h
+++ b/include/i2c.h
@@ -250,4 +250,16 @@  static inline void I2C_SET_BUS(unsigned int bus)
 		i2c_set_bus_num(bus);
 }
 
+/* Multi I2C definitions */
+enum {
+	I2C_0, I2C_1, I2C_2, I2C_3, I2C_4, I2C_5, I2C_6, I2C_7,
+	I2C_8, I2C_9, I2C_10,
+};
+
+/* Multi I2C busses handling */
+#ifdef CONFIG_SOFT_I2C_MULTI_BUS
+extern int get_multi_scl_pin(void);
+extern int get_multi_sda_pin(void);
+extern int multi_i2c_init(void);
+#endif
 #endif	/* _I2C_H_ */