On Fri, Jun 5, 2015 at 3:51 PM, Romain Baeriswyl
<romain.baeris...@alitech.com> wrote:
> ---

Your patch is missing a detailed commit message.

>  .../devicetree/bindings/gpio/gpio-generic.txt      |   19 +++++
>  drivers/gpio/gpio-generic.c                        |   81 ++++++++++++++-----
>  2 files changed, 78 insertions(+), 22 deletions(-)
>  create mode 100644 Documentation/devicetree/bindings/gpio/gpio-generic.txt
>
> diff --git a/Documentation/devicetree/bindings/gpio/gpio-generic.txt 
> b/Documentation/devicetree/bindings/gpio/gpio-generic.txt
> new file mode 100644
> index 0000000..c2c4b98
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/gpio/gpio-generic.txt
> @@ -0,0 +1,19 @@
> +Bindings for gpio-generic
> +
> +Required properties:
> +- compatible : "basic-mmio-gpio" for little endian register access or
> +               "basic-mmio-gpio-be" for big endian register access
> +- ngpios: Specifies the number of gpio mapped in the register. The value is
> +          limited to the number of bits of the LONG type.
> +
> +Optional properties:
> +- base: Allows to forces the gpio number base offset used to index the gpio 
> in
> +        the device. If it is not see then the driver search autonoumously for
> +        valid index range.

A base property for GPIO drivers is frown upon nowadays. >:/

> +
> +Examples:
> +
> +       gpio_a {
> +               compatible = "basic-mmio-gpio";
> +               ngpios = <32>;
> +       };
> diff --git a/drivers/gpio/gpio-generic.c b/drivers/gpio/gpio-generic.c
> index b92a690..9a4354c 100644
> --- a/drivers/gpio/gpio-generic.c
> +++ b/drivers/gpio/gpio-generic.c
> @@ -15,11 +15,11 @@
>   *  `.just a single "data" register, where GPIO state can be read and/or `
>   *    `,..written. ,,..``~~~~ .....``.`.`.~~.```.`.........``````.```````
>   *        `````````
> -                                    ___
> -_/~~|___/~|   . ```~~~~~~       ___/___\___     ,~.`.`.`.`````.~~...,,,,...
> -__________|~$@~~~        %~    /o*o*o*o*o*o\   .. Implementing such a GPIO .
> -o        `                     ~~~~\___/~~~~    ` controller in FPGA is ,.`
> -                                                 `....trivial..'~`.```.```
> + *                                   ___
> + * _/~~|___/~|   . ```~~~~~~       ___/___\___     
> ,~.`.`.`.`````.~~...,,,,...
> + * __________|~$@~~~        %~    /o*o*o*o*o*o\   .. Implementing such a 
> GPIO .
> + * o        `                     ~~~~\___/~~~~    ` controller in FPGA is 
> ,.`
> + *                                                `....trivial..'~`.```.```

Comment fix? Why not, but this is not related to the subject of this
patch. Please do this in a separate patch.

>   *                                                    ```````
>   *  .```````~~~~`..`.``.``.
>   * .  The driver supports  `...       ,..```.`~~~```````````````....````.``,,
> @@ -61,6 +61,8 @@ o        `                     ~~~~\___/~~~~    ` 
> controller in FPGA is ,.`
>  #include <linux/platform_device.h>
>  #include <linux/mod_devicetable.h>
>  #include <linux/basic_mmio_gpio.h>
> +#include <linux/of.h>
> +#include <linux/of_device.h>
>
>  static void bgpio_write8(void __iomem *reg, unsigned long data)
>  {
> @@ -375,10 +377,9 @@ static int bgpio_setup_accessors(struct device *dev,
>                         dev_err(dev,
>                                 "64 bit big endian byte order unsupported\n");
>                         return -EINVAL;
> -               } else {
> -                       bgc->read_reg   = bgpio_read64;
> -                       bgc->write_reg  = bgpio_write64;
>                 }
> +               bgc->read_reg   = bgpio_read64;
> +               bgc->write_reg  = bgpio_write64;

Why change this? This if/else sequence was consistent with the other
cases, I think it would be better to keep it that way.

>                 break;
>  #endif /* BITS_PER_LONG >= 64 */
>         default:
> @@ -564,6 +565,27 @@ static void __iomem *bgpio_map(struct platform_device 
> *pdev,
>         return ret;
>  }
>
> +static const struct platform_device_id bgpio_id_table[] = {
> +       { "basic-mmio-gpio",
> +         .driver_data  = 0,
> +       }, { "basic-mmio-gpio-be",
> +         .driver_data  = BGPIOF_BIG_ENDIAN
> +       },
> +       { },
> +};

Formatting is wrong here. Please keep the same formatting as the
original statement.

> +MODULE_DEVICE_TABLE(platform, bgpio_id_table);
> +
> +static const struct of_device_id  bgpio_dt_ids[] = {
> +       { .compatible = "basic-mmio-gpio",

Same remark about formatting.

> +         .data = bgpio_id_table + 0

I would probably prefer &bgpio_id_table[0], but your call.

> +       },
> +       { .compatible = "basic-mmio-gpio-be",
> +         .data = bgpio_id_table + 1
> +       },

Instead of having two different compatible strings, how about making
the big-endian option a boolean DT property?

> +       { }
> +};
> +MODULE_DEVICE_TABLE(of, bgpio_dt_ids);
> +
>  static int bgpio_pdev_probe(struct platform_device *pdev)
>  {
>         struct device *dev = &pdev->dev;
> @@ -574,10 +596,37 @@ static int bgpio_pdev_probe(struct platform_device 
> *pdev)
>         void __iomem *dirout;
>         void __iomem *dirin;
>         unsigned long sz;
> -       unsigned long flags = pdev->id_entry->driver_data;
> +       unsigned long flags;
>         int err;
>         struct bgpio_chip *bgc;
> -       struct bgpio_pdata *pdata = dev_get_platdata(dev);
> +       struct bgpio_pdata *pdata;
> +
> +       if (of_have_populated_dt()) {
> +               const struct of_device_id *of_id =
> +                       of_match_device(bgpio_dt_ids, dev);
> +
> +               pdata = devm_kzalloc(dev, sizeof(struct bgpio_pdata),
> +                                    GFP_KERNEL);
> +               if (!pdata)
> +                       return -ENOMEM;
> +
> +               if (of_property_read_u32(dev->of_node, "ngpio",
> +                                        &pdata->ngpio)) {
> +                       dev_err(dev, "Failed to get field ngpio");
> +                       return -EINVAL;
> +               }
> +               if (of_property_read_u32(dev->of_node, "base", &pdata->base))
> +                       pdata->base = -1;
> +
> +               dev->platform_data = pdata;
> +
> +               if (of_id)
> +                       pdev->id_entry = of_id->data;
> +       }

Could you move this to a bgpio_parse_dt() function to keep this
function short and clear?

> +
> +       pdata = dev_get_platdata(dev);
> +
> +       flags = pdev->id_entry->driver_data;
>
>         r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dat");
>         if (!r)
> @@ -633,18 +682,6 @@ static int bgpio_pdev_remove(struct platform_device 
> *pdev)
>         return bgpio_remove(bgc);
>  }
>
> -static const struct platform_device_id bgpio_id_table[] = {
> -       {
> -               .name           = "basic-mmio-gpio",
> -               .driver_data    = 0,
> -       }, {
> -               .name           = "basic-mmio-gpio-be",
> -               .driver_data    = BGPIOF_BIG_ENDIAN,
> -       },
> -       { }
> -};
> -MODULE_DEVICE_TABLE(platform, bgpio_id_table);
> -
>  static struct platform_driver bgpio_driver = {
>         .driver = {
>                 .name = "basic-mmio-gpio",
> --
> 1.7.1
>
> *********************************************************
> This message contains information that may be confidential and/or privileged 
> and is intended only for the individual or entity named in the body of email 
> above. If this message has been received in error, your receipt of this 
> message is not intended to waive any applicable privilege. No one else may 
> disclose, copy, distribute or use the contents of this message. Unauthorized 
> use, dissemination and duplication is strictly prohibited, and may be 
> unlawful.
>
>
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to