Subject: [PATCH v4] ARM: s3c244x: Fix mess with gpio {set, get}_pull callbacks

From: [email-masked] (Lars-Peter Clausen)
Date: Tue, 30 Nov 2010 20:59:01 +0100

On 11/30/2010 08:46 PM, Vasily Khoruzhick wrote:
> Currently the {set,get}_pull callbacks of the s3c24xx_gpiocfg_default structure
> are initalized via s3c_gpio_{get,set}pull_1up. This results in a linker
> error when only CONFIG_CPU_S3C2442 is selected:
> 
> arch/arm/plat-s3c24xx/built-in.o:(.data+0x13f4): undefined reference to
> `s3c_gpio_getpull_1up'
> arch/arm/plat-s3c24xx/built-in.o:(.data+0x13f8): undefined reference to
> `s3c_gpio_setpull_1up'
> 
> The s3c2442 has pulldowns instead of pullups compared to the s3c2440.
> The method of controlling them is the same though.
> So this patch modifies the existing s3c_gpio_{get,set}pull_1up helper functions
> to take an additional parameter deciding whether the pin has a pullup or pulldown.
> The s3c_gpio_{get,set}pull_1{down,up} functions then wrap that functions passing
> either S3C_GPIO_PULL_UP or S3C_GPIO_PULL_DOWN.
> 
> Furthermore this patch sets up the s3c24xx_gpiocfg_default.{get,set}_pull fields
> in the s3c244{0,2}_map_io function to the new pulldown helper functions.
> 
> Based on patch from "Lars-Peter Clausen" <[email-masked]>
> 
> Signed-off-by: Vasily Khoruzhick <[email-masked]>
> ---
> v2: adapt patch for 2.6.37-rc1
> v3: restore default pull callbacks, add default pull callbacks for s3c2442
> v4: remove default pull callbacks, set them in per-soc map_io function instead.
>  arch/arm/mach-s3c2440/Kconfig                      |    1 +
>  arch/arm/mach-s3c2440/s3c2440.c                    |   11 ++++-
>  arch/arm/mach-s3c2440/s3c2442.c                    |   14 ++++++
>  arch/arm/plat-s3c24xx/cpu.c                        |    8 ++--
>  arch/arm/plat-s3c24xx/gpiolib.c                    |    2 -
>  arch/arm/plat-s3c24xx/include/plat/s3c244x.h       |    7 +++-
>  arch/arm/plat-samsung/gpio-config.c                |   45 ++++++++++++++++----
>  .../plat-samsung/include/plat/gpio-cfg-helpers.h   |   11 +++++
>  8 files changed, 80 insertions(+), 19 deletions(-)
> 
> ...
>
> +static int s3c_gpio_setpull_1(struct s3c_gpio_chip *chip,
> +			 unsigned int off, s3c_gpio_pull_t pull,
> +			 s3c_gpio_pull_t updown)
>  {
>  	void __iomem *reg = chip->base + 0x08;
>  	u32 pup = __raw_readl(reg);
>  
> -	pup = __raw_readl(reg);
> -
> -	if (pup == S3C_GPIO_PULL_UP)
> +	if (pup == updown)
This should be pull == updown, otherwise looks fine to me

>  		pup &= ~(1 << off);
>  	else if (pup == S3C_GPIO_PULL_NONE)
>  		pup |= (1 << off);
> @@ -300,17 +299,45 @@ int s3c_gpio_setpull_1up(struct s3c_gpio_chip *chip,
>  	return 0;
>  }

- Lars