[patch 2/2] Add GPIO DT support to s3c24xx

Grant Likely grant.likely at secretlab.ca
Mon Apr 11 16:47:19 EST 2011


On Sun, Apr 10, 2011 at 05:33:16PM +0200, Domenico Andreoli wrote:
> From: Domenico Andreoli <cavokz at gmail.com>
> 
> Assign proper OF node (= with matching physical base address) to each
> s3c24xx GPIO chip.
> 
> Signed-off-by: Domenico Andreoli <cavokz at gmail.com>

Looks pretty good.  Minor comments below.

g.

> 
> ---
>  arch/arm/plat-s3c24xx/gpiolib.c |   45 ++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 45 insertions(+)
> 
> Index: b/arch/arm/plat-s3c24xx/gpiolib.c
> ===================================================================
> --- a/arch/arm/plat-s3c24xx/gpiolib.c	2011-04-10 16:24:59.000000000 +0200
> +++ b/arch/arm/plat-s3c24xx/gpiolib.c	2011-04-10 17:12:32.000000000 +0200
> @@ -19,6 +19,8 @@
>  #include <linux/ioport.h>
>  #include <linux/io.h>
>  #include <linux/gpio.h>
> +#include <linux/of.h>
> +#include <linux/of_address.h>
>  
>  #include <plat/gpio-core.h>
>  #include <plat/gpio-cfg.h>
> @@ -97,6 +99,9 @@
>  			.direction_input	= s3c24xx_gpiolib_banka_input,
>  			.direction_output	= s3c24xx_gpiolib_banka_output,
>  		},
> +#ifdef CONFIG_OF_GPIO
> +		.dt_compat = "samsung,s3c2410-gpio-a",
> +#endif

The '-a' bit I suspect is wrong.  Aren't all the gpio banks of the same type?

>  	},
>  	[1] = {
>  		.base	= S3C2410_GPBCON,
> @@ -210,6 +215,45 @@
>  	},
>  };
>  
> +#ifdef CONFIG_OF_GPIO
> +static int s3c24xx_of_base_match(struct s3c_gpio_chip *chip, struct device_node *dn)
> +{
> +	const u32 *addrp;
> +	u64 addr;
> +
> +	addrp = of_get_address(dn, 0, 0, NULL);
> +	if (!addrp)
> +		return 0;
> +
> +	addr = of_translate_address(dn, addrp);
> +	if (addr == OF_BAD_ADDR)
> +		return 0;

Use of_address_to_resource() instead.

> +
> +	return chip->base == (addr - S3C24XX_PA_GPIO + S3C24XX_VA_GPIO);
> +}
> +
> +static void s3c24xx_attach_of_node(struct s3c_gpio_chip *chip)
> +{
> +	struct device_node *dn;
> +
> +	if (!chip->dt_compat)
> +		chip->dt_compat = "samsung,s3c2410-gpio";
> +
> +	for_each_compatible_node(dn, NULL, chip->dt_compat) {
> +		if (s3c24xx_of_base_match(chip, dn)) {
> +			chip->chip.of_node = dn;
> +			break;
> +		}
> +	}
> +}
> +
> +#else
> +
> +static void s3c24xx_attach_of_node(struct s3c_gpio_chip *chip)
> +{
> +}
> +
> +#endif
>  
>  static __init int s3c24xx_gpiolib_init(void)
>  {
> @@ -220,6 +264,7 @@
>  		if (!chip->config)
>  			chip->config = &s3c24xx_gpiocfg_default;
>  
> +		s3c24xx_attach_of_node(chip);
>  		s3c_gpiolib_add(chip);
>  	}
>  
> 
> _______________________________________________
> devicetree-discuss mailing list
> devicetree-discuss at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/devicetree-discuss


More information about the devicetree-discuss mailing list