linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: lars@metafoo.de (Lars-Peter Clausen)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH RESEND v3] ARM: s3c2442: Setup gpio {set, get}_pull callbacks
Date: Tue, 30 Nov 2010 12:53:43 +0100	[thread overview]
Message-ID: <4CF4E5C7.5020600@metafoo.de> (raw)
In-Reply-To: <001801cb9056$65296530$2f7c2f90$%kim@samsung.com>

On 11/30/2010 07:18 AM, Kukjin Kim wrote:
> 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 compiling kernel for s3c2442:
>>
>> 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'
>>
> Yeah, happened build error when selected only S3C2442.
> 
>> 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 s3c2442 cpu init function to the new pulldown helper functions.
>>
>> Based on patch from "Lars-Peter Clausen" <lars@metafoo.de>
>>
>> Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
>> ---
>> v2: adapt patch for 2.6.37-rc1
>> v3: restore default pull callbacks, add default pull callbacks for s3c2442
>>  arch/arm/mach-s3c2440/Kconfig                      |    1 +
>>  arch/arm/mach-s3c2440/s3c2442.c                    |    7 +++
>>  arch/arm/plat-s3c24xx/gpiolib.c                    |    9 +++-
>>  arch/arm/plat-samsung/gpio-config.c                |   44
> ++++++++++++++++--
>> -
>>  .../plat-samsung/include/plat/gpio-cfg-helpers.h   |   11 +++++
>>  5 files changed, 63 insertions(+), 9 deletions(-)
>>
>> diff --git a/arch/arm/mach-s3c2440/Kconfig b/arch/arm/mach-s3c2440/Kconfig
>> index ff024a6..478fae0 100644
>> --- a/arch/arm/mach-s3c2440/Kconfig
>> +++ b/arch/arm/mach-s3c2440/Kconfig
>> @@ -18,6 +18,7 @@ config CPU_S3C2440
>>  config CPU_S3C2442
>>  	bool
>>  	select CPU_ARM920T
>> +	select S3C_GPIO_PULL_DOWN
>>  	select S3C2410_CLOCK
>>  	select S3C2410_GPIO
>>  	select S3C2410_PM if PM
>> diff --git a/arch/arm/mach-s3c2440/s3c2442.c b/arch/arm/mach-
>> s3c2440/s3c2442.c
>> index 188ad1e..0dbc91c 100644
>> --- a/arch/arm/mach-s3c2440/s3c2442.c
>> +++ b/arch/arm/mach-s3c2440/s3c2442.c
>> @@ -32,6 +32,7 @@
>>  #include <linux/interrupt.h>
>>  #include <linux/ioport.h>
>>  #include <linux/mutex.h>
>> +#include <linux/gpio.h>
>>  #include <linux/clk.h>
>>  #include <linux/io.h>
>>
>> @@ -44,6 +45,10 @@
>>  #include <plat/clock.h>
>>  #include <plat/cpu.h>
>>
>> +#include <plat/gpio-core.h>
>> +#include <plat/gpio-cfg.h>
>> +#include <plat/gpio-cfg-helpers.h>
>> +
>>  /* S3C2442 extended clock support */
>>
>>  static unsigned long s3c2442_camif_upll_round(struct clk *clk,
>> @@ -160,6 +165,8 @@ static struct sys_device s3c2442_sysdev = {
>>  int __init s3c2442_init(void)
>>  {
>>  	printk("S3C2442: Initialising architecture\n");
> 
> To add empty line would be helpful to read here.
> 
>> +	s3c24xx_gpiocfg_default.set_pull = s3c_gpio_setpull_1down;
>> +	s3c24xx_gpiocfg_default.get_pull = s3c_gpio_getpull_1down;
>>
> Right now, this is ok to me...but I think we need to sort this out with
> other S3C SoCs.
> 
>>  	return sysdev_register(&s3c2442_sysdev);
>>  }
>> diff --git a/arch/arm/plat-s3c24xx/gpiolib.c b/arch/arm/plat-
>> s3c24xx/gpiolib.c
>> index 24c6f5a..b805dab 100644
>> --- a/arch/arm/plat-s3c24xx/gpiolib.c
>> +++ b/arch/arm/plat-s3c24xx/gpiolib.c
>> @@ -82,8 +82,13 @@ static struct s3c_gpio_cfg s3c24xx_gpiocfg_banka = {
>>  struct s3c_gpio_cfg s3c24xx_gpiocfg_default = {
>>  	.set_config	= s3c_gpio_setcfg_s3c24xx,
>>  	.get_config	= s3c_gpio_getcfg_s3c24xx,
>> -	.set_pull	= s3c_gpio_setpull_1up,
>> -	.get_pull	= s3c_gpio_getpull_1up,
>> +#if defined(CONFIG_S3C_GPIO_PULL_UP)
>> +	.set_pull       = s3c_gpio_setpull_1up,
>> +	.get_pull       = s3c_gpio_getpull_1up,
>                  ^^^^^^
> Why do you use white space instead of tab?
> Original code used tab in there.
> 
>> +#elif defined(CONFIG_S3C_GPIO_PULL_DOWN)
>> +	.set_pull	= s3c_gpio_setpull_1down,
>> +	.get_pull	= s3c_gpio_getpull_1down,
>> +#endif
> 
> Yeah, this is needed for avoiding build error with only S3C2442.
> But please remember, now, its default is CONFIG_S3C_GPIO_PULL_UP when used
> s3c2410_defconfig even though selected S3C_GPIO_PULL_DOWN together.
> 
> I will thinking about better method for single binary kernel of S3C24XX. As
> you know, current your method can not support it.
> 
>>  };
>>
>>  struct s3c_gpio_chip s3c24xx_gpios[] = {
>> diff --git a/arch/arm/plat-samsung/gpio-config.c b/arch/arm/plat-
>> samsung/gpio-config.c
>> index b732b77..ac7f13f 100644
>> --- a/arch/arm/plat-samsung/gpio-config.c
>> +++ b/arch/arm/plat-samsung/gpio-config.c
>> @@ -280,16 +280,17 @@ s3c_gpio_pull_t s3c_gpio_getpull_updown(struct
>> s3c_gpio_chip *chip,
>>  }
>>  #endif
>>
>> -#ifdef CONFIG_S3C_GPIO_PULL_UP
>> -int s3c_gpio_setpull_1up(struct s3c_gpio_chip *chip,
>> -			 unsigned int off, s3c_gpio_pull_t pull)
>> +#if defined(CONFIG_S3C_GPIO_PULL_UP) ||
> defined(CONFIG_S3C_GPIO_PULL_DOWN)
>> +static int s3c_gpio_setpull_1(struct s3c_gpio_chip *chip,
>> +			 unsigned int off, s3c_gpio_pull_t pull,
>> +			 s3c_gpio_pull_t updown)
> 
> Hmm...how about s3c_gpio_setpull_1updown(...)?
> And actually, not used 3rd argument, "pull" now.
> I prefer follwoing.
> 

You need the 4th arguemnt, because the s3c2440 only supports pullups and the s3c2442
only supports pulldowns. So you want to return -EINVAL if somebody tries to set a
pullup on a s3c2442 based board.
Your proposed solution would return 0 and set a pulldown instead.


> +static int s3c_gpio_setpull_1(struct s3c_gpio_chip *chip,
> +			      unsigned int off, s3c_gpio_pull_t pull)
> 
>>  {
>>  	void __iomem *reg = chip->base + 0x08;
>>  	u32 pup = __raw_readl(reg);
>>
>>  	pup = __raw_readl(reg);
> 
> Hmm...need twice read?
> 
>>
>> -	if (pup == S3C_GPIO_PULL_UP)
>> +	if (pup == updown)
>>  		pup &= ~(1 << off);
>>  	else if (pup == S3C_GPIO_PULL_NONE)
>>  		pup |= (1 << off);
> 
> Is this right? I think, your code is wrong :-(
> Of course, original code has bug too...
> 
> Should be like follwoing.
> 	
> +	pup >>= off;
> +
> +	if ((pull == S3C_GPIO_PULL_UP) || (pull == S3C_GPIO_PULL_DOWN))
> +		pup &= ~(1 << off);
> +	else if (pull == S3C_GPIO_PULL_NONE)
> +		pup |= (1 << off);
> +	else
> +		return -EINVAL;
> 
> 	...
> But, according to your patch, maybe not called "else if" and "else".
> Because you only used "S3C_GPIO_PULL_UP" and "S3C_GPIO_PULL_DOWN" as
> argument from caller function.
> 
> So should be separate it as Ben's original code.
> 
>> @@ -300,17 +301,46 @@ int s3c_gpio_setpull_1up(struct s3c_gpio_chip *chip,
>>  	return 0;
>>  }
>>
>> -s3c_gpio_pull_t s3c_gpio_getpull_1up(struct s3c_gpio_chip *chip,
>> -				     unsigned int off)
>> +static s3c_gpio_pull_t s3c_gpio_getpull_1(struct s3c_gpio_chip *chip,
>> +				     unsigned int off, s3c_gpio_pull_t
> updown)
> 
> s3c_gpio_getpull_1updown(...)?
> And...why need 3rd argument, "updown"

Same reason as above.

> 
> +static s3c_gpio_pull_t s3c_gpio_getpull_1(struct s3c_gpio_chip *chip,
> +					  unsigned int off)
> 
>>  {
>>  	void __iomem *reg = chip->base + 0x08;
>>  	u32 pup = __raw_readl(reg);
>>
>>  	pup &= (1 << off);
>> -	return pup ? S3C_GPIO_PULL_NONE : S3C_GPIO_PULL_UP;
>> +	return pup ? S3C_GPIO_PULL_NONE : updown;
> 
> Is this right?
> Hmm...No...
Why do you think it is wrong? As far as I can see it is correct.

> 
>> +}
>> +#endif /* CONFIG_S3C_GPIO_PULL_UP || CONFIG_S3C_GPIO_PULL_DOWN */
>> +
>> +#ifdef CONFIG_S3C_GPIO_PULL_UP
>> +s3c_gpio_pull_t s3c_gpio_getpull_1up(struct s3c_gpio_chip *chip,
>> +				     unsigned int off)
>> +{
>> +	return s3c_gpio_getpull_1(chip, off, S3C_GPIO_PULL_UP);
>> +}
>> +
>> +int s3c_gpio_setpull_1up(struct s3c_gpio_chip *chip,
>> +			 unsigned int off, s3c_gpio_pull_t pull)
>> +{
>> +	return s3c_gpio_setpull_1(chip, off, pull, S3C_GPIO_PULL_UP);
>>  }
>>  #endif /* CONFIG_S3C_GPIO_PULL_UP */
>>
>> +#ifdef CONFIG_S3C_GPIO_PULL_DOWN
>> +s3c_gpio_pull_t s3c_gpio_getpull_1down(struct s3c_gpio_chip *chip,
>> +				     unsigned int off)
>> +{
>> +	return s3c_gpio_getpull_1(chip, off, S3C_GPIO_PULL_DOWN);
>> +}
>> +
>> +int s3c_gpio_setpull_1down(struct s3c_gpio_chip *chip,
>> +			 unsigned int off, s3c_gpio_pull_t pull)
>> +{
>> +	return s3c_gpio_setpull_1(chip, off, pull, S3C_GPIO_PULL_DOWN);
>> +}
>> +#endif /* CONFIG_S3C_GPIO_PULL_DOWN */
>> +
>> +
> 
> No need 2 empty lines.
> 
>>  #ifdef CONFIG_S5P_GPIO_DRVSTR
>>  s5p_gpio_drvstr_t s5p_gpio_get_drvstr(unsigned int pin)
>>  {
>> diff --git a/arch/arm/plat-samsung/include/plat/gpio-cfg-helpers.h
>> b/arch/arm/plat-samsung/include/plat/gpio-cfg-helpers.h
>> index 8fd65d8..0d2c570 100644
>> --- a/arch/arm/plat-samsung/include/plat/gpio-cfg-helpers.h
>> +++ b/arch/arm/plat-samsung/include/plat/gpio-cfg-helpers.h
>> @@ -210,6 +210,17 @@ extern s3c_gpio_pull_t s3c_gpio_getpull_1up(struct
>> s3c_gpio_chip *chip,
>>  					    unsigned int off);
>>
>>  /**
>> + * s3c_gpio_getpull_1down() - Get configuration for choice of down or
> none
>> + * @chip: The gpio chip that the GPIO pin belongs to
>> + * @off: The offset to the pin to get the configuration of.
>> + *
>> + * This helper function reads the state of the pull-down resistor for the
>> + * given GPIO in the same case as s3c_gpio_setpull_1down.
>> +*/
>> +extern s3c_gpio_pull_t s3c_gpio_getpull_1down(struct s3c_gpio_chip *chip,
>> +					    unsigned int off);
>> +
> 
> Need to add "extern int s3c_gpio_setpull_1down(...);"

It is already present in the current code.

> 
>> +/**
>>   * s3c_gpio_setpull_s3c2443() - Pull configuration for s3c2443.
>>   * @chip: The gpio chip that is being configured.
>>   * @off: The offset for the GPIO being configured.
>> --
> 
> Please make sure your code has no problem again before submitting.
> However, your pointing out is right. Should be fixed this...
> 
> Thanks.
> 
> Best regards,
> Kgene.
> --
> Kukjin Kim <kgene.kim@samsung.com>, Senior Engineer,
> SW Solution Development Team, Samsung Electronics Co., Ltd.
> 

  reply	other threads:[~2010-11-30 11:53 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-09-20 22:00 [PATCH] ARM: s3c2442: Setup gpio {set,get}_pull callbacks Lars-Peter Clausen
2010-09-20 22:00 ` [PATCH] ARM: s3c24xx: Set ARCH_NR_GPIOS according to the selected SoC types Lars-Peter Clausen
2010-09-20 23:41 ` [PATCH] ARM: s3c2442: Setup gpio {set,get}_pull callbacks Ben Dooks
2010-09-21  5:28   ` Abdoulaye Walsimou GAYE
2010-11-06  7:54 ` [PATCH v2] " Vasily Khoruzhick
2010-11-06 16:09   ` Abdoulaye Walsimou GAYE
2010-11-08  9:08     ` Vasily Khoruzhick
2010-11-08 20:26   ` [PATCH v3] " Vasily Khoruzhick
2010-11-08 21:41     ` Abdoulaye Walsimou GAYE
2010-11-29  9:56     ` Vasily Khoruzhick
2010-11-29 10:15       ` Kukjin Kim
2010-11-29 10:26         ` [PATCH RESEND " Vasily Khoruzhick
2010-11-30  6:18           ` [PATCH RESEND v3] ARM: s3c2442: Setup gpio {set, get}_pull callbacks Kukjin Kim
2010-11-30 11:53             ` Lars-Peter Clausen [this message]
2010-11-30 12:01               ` Vasily Khoruzhick
2010-11-30 13:12                 ` Lars-Peter Clausen
2010-11-30 14:33                   ` Vasily Khoruzhick
2010-11-30 14:53                     ` Lars-Peter Clausen
2010-11-30 15:01                       ` Vasily Khoruzhick
2010-11-30 19:46                         ` [PATCH v4] ARM: s3c244x: Fix mess with gpio {set,get}_pull callbacks Vasily Khoruzhick
2010-11-30 19:59                           ` [PATCH v4] ARM: s3c244x: Fix mess with gpio {set, get}_pull callbacks Lars-Peter Clausen
2010-11-30 20:05                             ` Vasily Khoruzhick
2010-11-30 20:12                             ` [PATCH v5] ARM: s3c244x: Fix mess with gpio {set,get}_pull callbacks Vasily Khoruzhick
2010-12-01  0:22                               ` [PATCH v5] ARM: s3c244x: Fix mess with gpio {set, get}_pull callbacks Ben Dooks
2010-12-03  9:40                                 ` Kukjin Kim
2010-12-01  7:26                               ` [PATCH v5] ARM: s3c244x: Fix mess with gpio {set,get}_pull callbacks Kukjin Kim
2010-12-01 10:17                                 ` [PATCH v5] ARM: s3c244x: Fix mess with gpio {set, get}_pull callbacks Vasily Khoruzhick
2010-12-01 12:05                                   ` [PATCH v5] ARM: s3c244x: Fix mess with gpio {set,get}_pull callbacks Kukjin Kim
2010-12-01 12:16                                     ` [PATCH v5] ARM: s3c244x: Fix mess with gpio {set, get}_pull callbacks Vasily Khoruzhick
2010-12-01  5:28                             ` [PATCH v4] ARM: s3c244x: Fix mess with gpio {set,get}_pull callbacks Kukjin Kim
2010-12-01  6:19                               ` [PATCH v4] ARM: s3c244x: Fix mess with gpio {set, get}_pull callbacks Vasily Khoruzhick
2010-12-01  6:29                               ` [PATCH v6] ARM: s3c244x: Fix mess with gpio {set,get}_pull callbacks Vasily Khoruzhick
2010-12-01  5:19               ` [PATCH RESEND v3] ARM: s3c2442: Setup gpio {set, get}_pull callbacks Kukjin Kim
2010-11-29 10:28         ` [PATCH v3] ARM: s3c2442: Setup gpio {set,get}_pull callbacks Vasily Khoruzhick

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4CF4E5C7.5020600@metafoo.de \
    --to=lars@metafoo.de \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).