[PATCH] gpio: samsung: add devicetree init for s3c24xx arches

Thomas Abraham thomas.abraham at linaro.org
Tue Aug 28 14:44:02 EST 2012


On 27 August 2012 13:31, Heiko Stübner <heiko at sntech.de> wrote:
> Hi Thomas,
>
> thanks for your review:
>
> Am Montag, 27. August 2012, 06:20:49 schrieb Thomas Abraham:
>> Hi Heiko,
>>
>> On 26 August 2012 03:23, Heiko Stübner <heiko at sntech.de> wrote:
>> > Until now the Exynos-SoC was the only Samsung-SoC supporting the GPIOs
>> > via the device tree. This patch implements dt-support for the
>> > s3c24xx arches.
>> >
>> > The controllers contain only 3 cells, as the underlying gpio controller
>> > does not support controlling the drive strength on a gpio level.
>> >
>> > Tested with the gpio-keys driver on a s3c2416 based machine.
>> >
>> > Signed-off-by: Heiko Stuebner <heiko at sntech.de>
>> > ---
>> >
>> >  .../devicetree/bindings/gpio/gpio-samsung.txt      |   38 ++++++++++++
>> >  drivers/gpio/gpio-samsung.c                        |   63
>> >  ++++++++++++++++++++ 2 files changed, 101 insertions(+), 0 deletions(-)
>> >
>> > diff --git a/Documentation/devicetree/bindings/gpio/gpio-samsung.txt
>> > b/Documentation/devicetree/bindings/gpio/gpio-samsung.txt index
>> > 5375625..ce6a7d4 100644
>> > --- a/Documentation/devicetree/bindings/gpio/gpio-samsung.txt
>> > +++ b/Documentation/devicetree/bindings/gpio/gpio-samsung.txt
>> >
>> > @@ -39,3 +39,41 @@ Example:
>> >                 #gpio-cells = <4>;
>> >                 gpio-controller;
>> >
>> >         };
>> >
>> > +
>> > +
>> > +Samsung S3C24XX GPIO Controller
>> > +
>> > +Required properties:
>> > +- compatible: Compatible property value should be
>> > "samsung,s3c24xx-gpio".
>>
>> This is debatable, but I would choose to be specific here and use
>> "samsing,s3c2416-gpio". For instance, SoC's in s3c24xx family have
>> differing value for pull none/down/up.
>
> Hmmm, but the logic to drive the gpio controller is the same for all arches.
> The only difference is the number to use for the different pull up/down
> settings. So I think the "samsung,s3c24xx-gpio" is ok but the documentation
> should simply reflect the different pull settings.

Ok.

>
>
>> > +
>> > +- reg: Physical base address of the controller and length of memory
>> > mapped +  region.
>> > +
>> > +- #gpio-cells: Should be 3. The syntax of the gpio specifier used by
>> > client nodes +  should be the following with values derived from the SoC
>> > user manual. +     <[phandle of the gpio controller node]
>> > +      [pin number within the gpio controller]
>> > +      [mux function]
>> > +      [flags and pull up/down]
>> > +
>> > +  Values for gpio specifier:
>> > +  - Pin number: depending on the controller a number from 0 up to 15.
>> > +  - Flags and Pull Up/Down: 0 - Pull Up/Down Disabled.
>> > +                            1 - Pull Down Enabled.
>> > +                            3 - Pull Up Enabled.
>>
>> As per s3c2416 user manual, 2 is used for Pull Up and 3 is listed as
>> reserved value. Any particular reason to use 3 here for pull up and
>> not 2 as per the user manual?
>
> Sorry, copy and paste error :-)

Ok.

>
>
>> > +          Bit 16 (0x00010000) - Input is active low.
>> > +
>> > +- gpio-controller: Specifies that the node is a gpio controller.
>> > +- #address-cells: should be 1.
>> > +- #size-cells: should be 1.
>>
>> It would be informative to add information about the 'mux function'
>> cell here as well. Specifically, on how to handle the banks that have
>> an extended GPxSEL register that allow additional pin function
>> selection.
>
> Will add a mux function description.
>
> Until now I've never realised the existence of the GPxSEL registers, so thanks
> for the pointer :-).
>
> But is this used in the driver at all? All the setcfg/getcfg functions in
> gpio-samsung.c only handle the GPxCON registers - I haven't found code to
> handle the GPxSEL registers at all. So my guess is that this was never
> implemented - or that I'm blind ;-) .

You are right, there is no code that is handling the GPxCON registers.

Thanks,
Thomas.

>
>
>> > +
>> > +Example:
>> > +
>> > +       gpa: gpio-controller at 56000000 {
>> > +               #address-cells = <1>;
>> > +               #size-cells = <1>;
>> > +               compatible = "samsung,s3c24xx-gpio";
>> > +               reg = <0x56000000 0x10>;
>> > +               #gpio-cells = <3>;
>> > +               gpio-controller;
>> > +       };
>> > diff --git a/drivers/gpio/gpio-samsung.c b/drivers/gpio/gpio-samsung.c
>> > index a150d2e..80a2817 100644
>> > --- a/drivers/gpio/gpio-samsung.c
>> > +++ b/drivers/gpio/gpio-samsung.c
>> > @@ -938,6 +938,67 @@ static void __init samsung_gpiolib_add(struct
>> > samsung_gpio_chip *chip)
>> >
>> >                 s3c_gpiolib_track(chip);
>> >
>> >  }
>> >
>> > +#if defined(CONFIG_PLAT_S3C24XX) && defined(CONFIG_OF)
>> > +static int s3c24xx_gpio_xlate(struct gpio_chip *gc,
>> > +                       const struct of_phandle_args *gpiospec, u32
>> > *flags) +{
>> > +       unsigned int pin;
>> > +
>> > +       if (WARN_ON(gc->of_gpio_n_cells < 3))
>> > +               return -EINVAL;
>> > +
>> > +       if (WARN_ON(gpiospec->args_count < gc->of_gpio_n_cells))
>> > +               return -EINVAL;
>> > +
>> > +       if (gpiospec->args[0] > gc->ngpio)
>> > +               return -EINVAL;
>> > +
>> > +       pin = gc->base + gpiospec->args[0];
>> > +
>> > +       if (s3c_gpio_cfgpin(pin, S3C_GPIO_SFN(gpiospec->args[1])))
>> > +               pr_warn("gpio_xlate: failed to set pin function\n");
>> > +       if (s3c_gpio_setpull(pin, gpiospec->args[2] & 0xffff))
>> > +               pr_warn("gpio_xlate: failed to set pin pull up/down\n");
>> > +
>> > +       if (flags)
>> > +               *flags = gpiospec->args[2] >> 16;
>> > +
>> > +       return gpiospec->args[0];
>> > +}
>> > +
>> > +static const struct of_device_id s3c24xx_gpio_dt_match[] __initdata = {
>> > +       { .compatible = "samsung,s3c24xx-gpio", },
>> > +       {}
>> > +};
>> > +
>> > +static __init void s3c24xx_gpiolib_attach_ofnode(struct
>> > samsung_gpio_chip *chip, +
>> >  u64 base, u64 offset) +{
>> > +       struct gpio_chip *gc =  &chip->chip;
>> > +       u64 address;
>> > +
>> > +       if (!of_have_populated_dt())
>> > +               return;
>> > +
>> > +       address = chip->base ? base + ((u32)chip->base & 0xfff) : base +
>> > offset; +       gc->of_node = of_find_matching_node_by_address(NULL,
>> > +                       s3c24xx_gpio_dt_match, address);
>> > +       if (!gc->of_node) {
>> > +               pr_info("gpio: device tree node not found for gpio
>> > controller" +                       " with base address %08llx\n",
>> > address); +               return;
>> > +       }
>> > +       gc->of_gpio_n_cells = 3;
>> > +       gc->of_xlate = s3c24xx_gpio_xlate;
>> > +}
>> > +#elif defined(CONFIG_PLAT_S3C24XX)
>> > +static __init void s3c24xx_gpiolib_attach_ofnode(struct
>> > samsung_gpio_chip *chip, +
>> >  u64 base, u64 offset) +{
>> > +       return;
>> > +}
>> > +#endif /* defined(CONFIG_PLAT_S3C24XX) && defined(CONFIG_OF) */
>> > +
>> >
>> >  static void __init s3c24xx_gpiolib_add_chips(struct samsung_gpio_chip
>> >  *chip,
>> >
>> >                                              int nr_chips, void __iomem
>> >                                              *base)
>> >
>> >  {
>> >
>> > @@ -962,6 +1023,8 @@ static void __init s3c24xx_gpiolib_add_chips(struct
>> > samsung_gpio_chip *chip,
>> >
>> >                         gc->direction_output =
>> >                         samsung_gpiolib_2bit_output;
>> >
>> >                 samsung_gpiolib_add(chip);
>> >
>> > +
>> > +               s3c24xx_gpiolib_attach_ofnode(chip, S3C24XX_PA_GPIO, i *
>> > 0x10);
>> >
>> >         }
>> >
>> >  }
>> >
>> > --
>> > 1.7.2.3
>>
>> Overall, this is patch looks fine.
>>
>> Reviewed-by: Thomas Abraham <thomas.abraham at linaro.org>
>
>
> Heiko


More information about the devicetree-discuss mailing list