[U-Boot] [PATCH] gpio:fix: Proper handling of GPIO subsystem parts at Samsung devices
Lukasz Majewski
l.majewski at samsung.com
Thu Sep 13 15:45:03 CEST 2012
Hi Minkyu,
> Now proper GPIO parts numbering is handled at Samsung devices.
> This fix is necessary for code using GPIO located at other banks
> than first.
>
> Test HW:
> - Exynos4210 - Trats
> - S5PC110 - goni
>
> Signed-off-by: Lukasz Majewski <l.majewski at samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.park at samsung.com>
> Cc: Minkyu Kang <mk7.kang at samsung.com>
> ---
> arch/arm/include/asm/arch-exynos/gpio.h | 19 +++++++++++++++++++
> arch/arm/include/asm/arch-s5pc1xx/gpio.h | 7 ++++++-
> drivers/gpio/s5p_gpio.c | 6 ++++--
> 3 files changed, 29 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm/include/asm/arch-exynos/gpio.h
> b/arch/arm/include/asm/arch-exynos/gpio.h index 7a9bb90..fdb52fa
> 100644 --- a/arch/arm/include/asm/arch-exynos/gpio.h
> +++ b/arch/arm/include/asm/arch-exynos/gpio.h
> @@ -204,6 +204,25 @@ static inline unsigned int s5p_gpio_base(int nr)
> return 0;
> }
>
> +static inline unsigned int s5p_gpio_part_max(int nr)
> +{
> + if (cpu_is_exynos5()) {
> + if (nr < EXYNOS5_GPIO_PART1_MAX)
> + return 0;
> + else if (nr < EXYNOS5_GPIO_PART2_MAX)
> + return EXYNOS5_GPIO_PART1_MAX;
> + else
> + return EXYNOS5_GPIO_PART2_MAX;
> +
> + } else if (cpu_is_exynos4()) {
> + if (nr < EXYNOS4_GPIO_PART1_MAX)
> + return 0;
> + else
> + return EXYNOS4_GPIO_PART1_MAX;
> + }
> +
> + return 0;
> +}
> #endif
>
> /* Pin configurations */
> diff --git a/arch/arm/include/asm/arch-s5pc1xx/gpio.h
> b/arch/arm/include/asm/arch-s5pc1xx/gpio.h index 76b901b..00e498d
> 100644 --- a/arch/arm/include/asm/arch-s5pc1xx/gpio.h
> +++ b/arch/arm/include/asm/arch-s5pc1xx/gpio.h
> @@ -143,7 +143,12 @@ static inline unsigned int s5p_gpio_base(int nr)
> return S5PC110_GPIO_BASE;
> }
>
> -#define s5pc110_gpio_get_nr(bank, pin) \
> +static inline unsigned int s5p_gpio_part_max(int nr)
> +{
> + return 0;
> +}
> +
> +#define s5pc110_gpio_get_nr(bank, pin) \
> ((((((unsigned int)&(((struct s5pc110_gpio
> *)S5PC110_GPIO_BASE)->bank))\
> - S5PC110_GPIO_BASE) / sizeof(struct s5p_gpio_bank)) \
> * GPIO_PER_BANK) + pin)
> diff --git a/drivers/gpio/s5p_gpio.c b/drivers/gpio/s5p_gpio.c
> index 47f3213..656bf4a 100644
> --- a/drivers/gpio/s5p_gpio.c
> +++ b/drivers/gpio/s5p_gpio.c
> @@ -144,9 +144,11 @@ void s5p_gpio_set_rate(struct s5p_gpio_bank
> *bank, int gpio, int mode)
> struct s5p_gpio_bank *s5p_gpio_get_bank(unsigned gpio)
> {
> - int bank = gpio / GPIO_PER_BANK;
> - bank *= sizeof(struct s5p_gpio_bank);
> + int bank;
> + unsigned g = gpio - s5p_gpio_part_max(gpio);
>
> + bank = g / GPIO_PER_BANK;
> + bank *= sizeof(struct s5p_gpio_bank);
> return (struct s5p_gpio_bank *) (s5p_gpio_base(gpio) + bank);
> }
>
Do you have any comments about this fix?
--
Best regards,
Lukasz Majewski
Samsung Poland R&D Center | Linux Platform Group
More information about the U-Boot
mailing list