
Dear Lukasz Majewski,
On 12 August 2011 17:32, Lukasz Majewski l.majewski@samsung.com wrote:
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.majewski@samsung.com Signed-off-by: Kyungmin Park kyungmin.park@samsung.com Cc: Minkyu Kang mk7.kang@samsung.com Cc: Heiko Schocher hs@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/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;
I can't understand it. Why is it need? If you want to get gpio base address, then use the define value directly. s5p_gpio pointer is unnecessary.
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 */
How can use gpio part2??
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;
As I said.. the purpose of s5p_gpio is to get base address, then please use define value.
- 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;
+}
And you should solve how can use gpio part2.
Thanks Minkyu Kang.