This patch adds support for software I2C for GONI reference target.
It adds support for access to GPIOs by number, not as it is present,
by bank and offset.

Signed-off-by: Lukasz Majewski <l.majew...@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.p...@samsung.com>
Cc: Minkyu Kang <mk7.k...@samsung.com>
Cc: Heiko Schocher <h...@denx.de>

---
Changes for v2:
        - Generic GPIO code added to arch/arm/gpio.h
        - Platform dependent GPIO code added to board/samsung/goni.c
        - Code cleanup
Changes for v3:
        - I2C GPIO common code added to drivers/gpio/s5p_gpio.c
        - i2c_init_board() function added(required by soft_i2c)
Changes for v4:
        - i2x_init_board() removed
        - s5pc210 support added
        - GPIO code and I2C enable code split to separate patches
---
 arch/arm/include/asm/arch-s5pc1xx/gpio.h |   38 +++++++++++++++++++++++++++++
 arch/arm/include/asm/arch-s5pc2xx/gpio.h |   39 ++++++++++++++++++++++++++++++
 board/samsung/goni/goni.c                |    2 +
 board/samsung/universal_c210/universal.c |    2 +
 drivers/gpio/s5p_gpio.c                  |   21 ++++++++++++++++
 5 files changed, 102 insertions(+), 0 deletions(-)

diff --git a/arch/arm/include/asm/arch-s5pc1xx/gpio.h 
b/arch/arm/include/asm/arch-s5pc1xx/gpio.h
index 903de9c..4a5ca87 100644
--- a/arch/arm/include/asm/arch-s5pc1xx/gpio.h
+++ b/arch/arm/include/asm/arch-s5pc1xx/gpio.h
@@ -134,6 +134,41 @@ unsigned int s5p_gpio_get_value(struct s5p_gpio_bank 
*bank, int gpio);
 void s5p_gpio_set_pull(struct s5p_gpio_bank *bank, int gpio, int mode);
 void s5p_gpio_set_drv(struct s5p_gpio_bank *bank, int gpio, int mode);
 void s5p_gpio_set_rate(struct s5p_gpio_bank *bank, int gpio, int mode);
+struct s5p_gpio_bank *s5p_gpio_get_bank(int nr);
+int s5p_gpio_get_pin(int nr);
+
+static inline int gpio_request(int gpio, const char *label)
+{
+       return 0;
+}
+
+static inline int gpio_direction_input(int nr)
+{
+       s5p_gpio_direction_input(s5p_gpio_get_bank(nr),
+                               s5p_gpio_get_pin(nr));
+       return 0;
+}
+
+static inline int gpio_direction_output(int nr, int value)
+{
+       s5p_gpio_direction_output(s5p_gpio_get_bank(nr),
+                                s5p_gpio_get_pin(nr), value);
+       return 0;
+}
+
+static inline int gpio_get_value(int nr)
+{
+       return (int) s5p_gpio_get_value(s5p_gpio_get_bank(nr),
+                                      s5p_gpio_get_pin(nr));
+}
+
+static inline void gpio_set_value(int nr, int value)
+{
+       s5p_gpio_set_value(s5p_gpio_get_bank(nr),
+                         s5p_gpio_get_pin(nr), value);
+}
+
+extern void *s5p_gpio;
 #endif
 
 /* Pin configurations */
@@ -155,4 +190,7 @@ void s5p_gpio_set_rate(struct s5p_gpio_bank *bank, int 
gpio, int mode);
 #define GPIO_DRV_FAST  0x0
 #define GPIO_DRV_SLOW  0x1
 
+/* GPIO pins per bank  */
+#define GPIO_PER_BANK 8
+
 #endif
diff --git a/arch/arm/include/asm/arch-s5pc2xx/gpio.h 
b/arch/arm/include/asm/arch-s5pc2xx/gpio.h
index 8db5895..82aaab5 100644
--- a/arch/arm/include/asm/arch-s5pc2xx/gpio.h
+++ b/arch/arm/include/asm/arch-s5pc2xx/gpio.h
@@ -88,6 +88,41 @@ unsigned int s5p_gpio_get_value(struct s5p_gpio_bank *bank, 
int gpio);
 void s5p_gpio_set_pull(struct s5p_gpio_bank *bank, int gpio, int mode);
 void s5p_gpio_set_drv(struct s5p_gpio_bank *bank, int gpio, int mode);
 void s5p_gpio_set_rate(struct s5p_gpio_bank *bank, int gpio, int mode);
+struct s5p_gpio_bank *s5p_gpio_get_bank(int nr);
+int s5p_gpio_get_pin(int nr);
+
+static inline int gpio_request(int gpio, const char *label)
+{
+       return 0;
+}
+
+static inline int gpio_direction_input(int nr)
+{
+       s5p_gpio_direction_input(s5p_gpio_get_bank(nr),
+                               s5p_gpio_get_pin(nr));
+       return 0;
+}
+
+static inline int gpio_direction_output(int nr, int value)
+{
+       s5p_gpio_direction_output(s5p_gpio_get_bank(nr),
+                                s5p_gpio_get_pin(nr), value);
+       return 0;
+}
+
+static inline int gpio_get_value(int nr)
+{
+       return (int) s5p_gpio_get_value(s5p_gpio_get_bank(nr),
+                                      s5p_gpio_get_pin(nr));
+}
+
+static inline void gpio_set_value(int nr, int value)
+{
+       s5p_gpio_set_value(s5p_gpio_get_bank(nr),
+                         s5p_gpio_get_pin(nr), value);
+}
+
+extern void *s5p_gpio;
 #endif
 
 /* Pin configurations */
@@ -108,4 +143,8 @@ void s5p_gpio_set_rate(struct s5p_gpio_bank *bank, int 
gpio, int mode);
 #define GPIO_DRV_4X    0x3
 #define GPIO_DRV_FAST  0x0
 #define GPIO_DRV_SLOW  0x1
+
+/* GPIO pins per bank  */
+#define GPIO_PER_BANK 8
+
 #endif
diff --git a/board/samsung/goni/goni.c b/board/samsung/goni/goni.c
index e24cd29..adc1e0e 100644
--- a/board/samsung/goni/goni.c
+++ b/board/samsung/goni/goni.c
@@ -29,11 +29,13 @@
 DECLARE_GLOBAL_DATA_PTR;
 
 static struct s5pc110_gpio *s5pc110_gpio;
+void *s5p_gpio;
 
 int board_init(void)
 {
        /* Set Initial global variables */
        s5pc110_gpio = (struct s5pc110_gpio *)S5PC110_GPIO_BASE;
+       s5p_gpio = (void *) s5pc110_gpio;
 
        gd->bd->bi_arch_number = MACH_TYPE_GONI;
        gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
diff --git a/board/samsung/universal_c210/universal.c 
b/board/samsung/universal_c210/universal.c
index 1b27e8b..b4a7f86 100644
--- a/board/samsung/universal_c210/universal.c
+++ b/board/samsung/universal_c210/universal.c
@@ -32,6 +32,7 @@ DECLARE_GLOBAL_DATA_PTR;
 
 struct s5pc210_gpio_part1 *gpio1;
 struct s5pc210_gpio_part2 *gpio2;
+void *s5p_gpio;
 unsigned int board_rev;
 
 u32 get_board_rev(void)
@@ -50,6 +51,7 @@ int board_init(void)
 {
        gpio1 = (struct s5pc210_gpio_part1 *) S5PC210_GPIO_PART1_BASE;
        gpio2 = (struct s5pc210_gpio_part2 *) S5PC210_GPIO_PART2_BASE;
+       s5p_gpio = (void *) gpio1; /* ptr used with I2C SW implementation */
 
        gd->bd->bi_arch_number = MACH_TYPE_UNIVERSAL_C210;
        gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
diff --git a/drivers/gpio/s5p_gpio.c b/drivers/gpio/s5p_gpio.c
index 2043859..49c43c7 100644
--- a/drivers/gpio/s5p_gpio.c
+++ b/drivers/gpio/s5p_gpio.c
@@ -141,3 +141,24 @@ void s5p_gpio_set_rate(struct s5p_gpio_bank *bank, int 
gpio, int mode)
 
        writel(value, &bank->drv);
 }
+
+int s5p_gpio_get_nr(void *gp_ptr, int gpio)
+{
+       unsigned int offset = gp_ptr - (void *) s5p_gpio;
+       offset /= sizeof(struct s5p_gpio_bank);
+
+       return (offset * GPIO_PER_BANK) + gpio;
+}
+
+struct s5p_gpio_bank *s5p_gpio_get_bank(int nr)
+{
+       int bank = nr / GPIO_PER_BANK;
+       bank *= sizeof(struct s5p_gpio_bank);
+
+       return (struct s5p_gpio_bank *) ((void *) s5p_gpio + bank);
+}
+
+int s5p_gpio_get_pin(int nr)
+{
+       return nr % GPIO_PER_BANK;
+}
-- 
1.7.2.3

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to