Re: [PATCH] gpio: add tps65218 gpio driver

2015-10-29 Thread Linus Walleij
On Fri, Oct 23, 2015 at 6:33 PM, Nicolas Saenz Julienne
 wrote:

> Driver for the GPIO block found in ti's tps65218 pmics.
>
> The device has two GPIOs and one GPO pin which can be configured as follows:
> GPIO1:
> -general-purpose, open-drain output controlled by GPO1 user bit and/or
>  sequencer
> -DDR3 reset input signal from SOC. Signal is either latched or
>  passed-trough to GPO2 pin. See below for details.
> GPO2:
> -general-purpose output controlled by GPO2 user bit
> -DDR3 reset output signal. Signal is controlled by GPIO1 and PGOOD.
>  See below for details.
> -Output buffer can be configured as open-drain or push-pull.
> GPIO3:
> -general-purpose, open-drain output controlled by GPO3 user bit and/or
>  sequencer
> -reset input-signal for DCDC1 and DCDC2.
>
> The input configurations are not meant to be used by the user so the driver
> only offers GPOs.
>
> v2: Added request routine that evaluates the fw config flags and removed 
> module
> owner
>
> Signed-off-by: Nicolas Saenz Julienne 
(...)

(Attend to the mail robot's comments)

> +#include 
> +#include 
> +#include 
> +#include 

Should be 

> +#include 
> +#include 
> +#include "gpiolib.h"
> +
> +struct tps65218_gpio {
> +   struct tps65218 *tps65218;
> +   struct gpio_chip gpio_chip;
> +};
> +
> +#define to_tg(gc)  container_of(gc, struct tps65218_gpio, gpio_chip)

Use a static inline function for this instead.

> +static int tps65218_gpio_get(struct gpio_chip *gc, unsigned offset)
> +{
> +   struct tps65218_gpio *tps65218_gpio = to_tg(gc);
> +   struct tps65218 *tps65218 = tps65218_gpio->tps65218;
> +   unsigned int val;
> +   int ret;
> +
> +   ret = tps65218_reg_read(tps65218, TPS65218_REG_ENABLE2, );
> +   if (ret)
> +   return ret;
> +
> +   return val & (TPS65218_ENABLE2_GPIO1 << offset);

Clamp to bool:
return !!(val & (TPS65218_ENABLE2_GPIO1 << offset));

> +static int tps65218_gpio_output(struct gpio_chip *gc, unsigned offset,
> +   int value)
> +{
> +   /* Only drives GPOs */
> +   return 0;
> +}

So shouldn't you implement a .set_direction() callback that will fail if
the user tries to set a line as input?

> +static int tps65218_gpio_request(struct gpio_chip *gc, unsigned offset)
> +{
> +   struct tps65218_gpio *tps65218_gpio = to_tg(gc);
> +   struct tps65218 *tps65218 = tps65218_gpio->tps65218;
> +   unsigned long flags = gc->desc->flags;
> +   int ret;
> +
> +   if (flags & FLAG_OPEN_SOURCE) {
> +   dev_err(gc->dev, "can't work as open source\n");
> +   return -EINVAL;
> +   }

This requires Laurent's recent patches I guess.

> +static struct gpio_chip template_chip = {
> +   .label  = "gpio-tps65218",
> +   .owner  = THIS_MODULE,
> +   .request= tps65218_gpio_request,
> +   .direction_output   = tps65218_gpio_output,
> +   .get= tps65218_gpio_get,
> +   .set= tps65218_gpio_set,
> +   .can_sleep  = true,
> +   .ngpio  = 3,
> +   .base   = -1,
> +};

As mentioned you need to implement .set_direction() and fail
to set any line as input.

Apart from this it looks very nice.

Yours,
Linus Walleij
--
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/


Re: [PATCH] gpio: add tps65218 gpio driver

2015-10-29 Thread Linus Walleij
On Fri, Oct 23, 2015 at 6:33 PM, Nicolas Saenz Julienne
 wrote:

> Driver for the GPIO block found in ti's tps65218 pmics.
>
> The device has two GPIOs and one GPO pin which can be configured as follows:
> GPIO1:
> -general-purpose, open-drain output controlled by GPO1 user bit and/or
>  sequencer
> -DDR3 reset input signal from SOC. Signal is either latched or
>  passed-trough to GPO2 pin. See below for details.
> GPO2:
> -general-purpose output controlled by GPO2 user bit
> -DDR3 reset output signal. Signal is controlled by GPIO1 and PGOOD.
>  See below for details.
> -Output buffer can be configured as open-drain or push-pull.
> GPIO3:
> -general-purpose, open-drain output controlled by GPO3 user bit and/or
>  sequencer
> -reset input-signal for DCDC1 and DCDC2.
>
> The input configurations are not meant to be used by the user so the driver
> only offers GPOs.
>
> v2: Added request routine that evaluates the fw config flags and removed 
> module
> owner
>
> Signed-off-by: Nicolas Saenz Julienne 
(...)

(Attend to the mail robot's comments)

> +#include 
> +#include 
> +#include 
> +#include 

Should be 

> +#include 
> +#include 
> +#include "gpiolib.h"
> +
> +struct tps65218_gpio {
> +   struct tps65218 *tps65218;
> +   struct gpio_chip gpio_chip;
> +};
> +
> +#define to_tg(gc)  container_of(gc, struct tps65218_gpio, gpio_chip)

Use a static inline function for this instead.

> +static int tps65218_gpio_get(struct gpio_chip *gc, unsigned offset)
> +{
> +   struct tps65218_gpio *tps65218_gpio = to_tg(gc);
> +   struct tps65218 *tps65218 = tps65218_gpio->tps65218;
> +   unsigned int val;
> +   int ret;
> +
> +   ret = tps65218_reg_read(tps65218, TPS65218_REG_ENABLE2, );
> +   if (ret)
> +   return ret;
> +
> +   return val & (TPS65218_ENABLE2_GPIO1 << offset);

Clamp to bool:
return !!(val & (TPS65218_ENABLE2_GPIO1 << offset));

> +static int tps65218_gpio_output(struct gpio_chip *gc, unsigned offset,
> +   int value)
> +{
> +   /* Only drives GPOs */
> +   return 0;
> +}

So shouldn't you implement a .set_direction() callback that will fail if
the user tries to set a line as input?

> +static int tps65218_gpio_request(struct gpio_chip *gc, unsigned offset)
> +{
> +   struct tps65218_gpio *tps65218_gpio = to_tg(gc);
> +   struct tps65218 *tps65218 = tps65218_gpio->tps65218;
> +   unsigned long flags = gc->desc->flags;
> +   int ret;
> +
> +   if (flags & FLAG_OPEN_SOURCE) {
> +   dev_err(gc->dev, "can't work as open source\n");
> +   return -EINVAL;
> +   }

This requires Laurent's recent patches I guess.

> +static struct gpio_chip template_chip = {
> +   .label  = "gpio-tps65218",
> +   .owner  = THIS_MODULE,
> +   .request= tps65218_gpio_request,
> +   .direction_output   = tps65218_gpio_output,
> +   .get= tps65218_gpio_get,
> +   .set= tps65218_gpio_set,
> +   .can_sleep  = true,
> +   .ngpio  = 3,
> +   .base   = -1,
> +};

As mentioned you need to implement .set_direction() and fail
to set any line as input.

Apart from this it looks very nice.

Yours,
Linus Walleij
--
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/


Re: [PATCH] gpio: add tps65218 gpio driver

2015-10-24 Thread kbuild test robot
Hi Nicolas,

[auto build test ERROR on gpio/for-next -- if it's inappropriate base, please 
suggest rules for selecting the more suitable base]

url:
https://github.com/0day-ci/linux/commits/Nicolas-Saenz-Julienne/gpio-add-tps65218-gpio-driver/20151024-003657
config: x86_64-randconfig-x002-201543 (attached as .config)
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64 

All errors (new ones prefixed by >>):

   drivers/gpio/gpio-tps65218.c: In function 'tps65218_gpio_probe':
>> drivers/gpio/gpio-tps65218.c:175:26: error: 'struct gpio_chip' has no member 
>> named 'of_node'
 tps65218_gpio->gpio_chip.of_node = pdev->dev.of_node;
 ^

vim +175 drivers/gpio/gpio-tps65218.c

   169  if (!tps65218_gpio)
   170  return -ENOMEM;
   171  
   172  tps65218_gpio->tps65218 = tps65218;
   173  tps65218_gpio->gpio_chip = template_chip;
   174  tps65218_gpio->gpio_chip.dev = >dev;
 > 175  tps65218_gpio->gpio_chip.of_node = pdev->dev.of_node;
   176  
   177  ret = gpiochip_add(_gpio->gpio_chip);
   178  if (ret < 0) {

---
0-DAY kernel test infrastructureOpen Source Technology Center
https://lists.01.org/pipermail/kbuild-all   Intel Corporation


.config.gz
Description: Binary data


Re: [PATCH] gpio: add tps65218 gpio driver

2015-10-24 Thread kbuild test robot
Hi Nicolas,

[auto build test ERROR on gpio/for-next -- if it's inappropriate base, please 
suggest rules for selecting the more suitable base]

url:
https://github.com/0day-ci/linux/commits/Nicolas-Saenz-Julienne/gpio-add-tps65218-gpio-driver/20151024-003657
config: x86_64-randconfig-x002-201543 (attached as .config)
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64 

All errors (new ones prefixed by >>):

   drivers/gpio/gpio-tps65218.c: In function 'tps65218_gpio_probe':
>> drivers/gpio/gpio-tps65218.c:175:26: error: 'struct gpio_chip' has no member 
>> named 'of_node'
 tps65218_gpio->gpio_chip.of_node = pdev->dev.of_node;
 ^

vim +175 drivers/gpio/gpio-tps65218.c

   169  if (!tps65218_gpio)
   170  return -ENOMEM;
   171  
   172  tps65218_gpio->tps65218 = tps65218;
   173  tps65218_gpio->gpio_chip = template_chip;
   174  tps65218_gpio->gpio_chip.dev = >dev;
 > 175  tps65218_gpio->gpio_chip.of_node = pdev->dev.of_node;
   176  
   177  ret = gpiochip_add(_gpio->gpio_chip);
   178  if (ret < 0) {

---
0-DAY kernel test infrastructureOpen Source Technology Center
https://lists.01.org/pipermail/kbuild-all   Intel Corporation


.config.gz
Description: Binary data


[PATCH] gpio: add tps65218 gpio driver

2015-10-23 Thread Nicolas Saenz Julienne
Driver for the GPIO block found in ti's tps65218 pmics.

The device has two GPIOs and one GPO pin which can be configured as follows:
GPIO1:
-general-purpose, open-drain output controlled by GPO1 user bit and/or
 sequencer
-DDR3 reset input signal from SOC. Signal is either latched or
 passed-trough to GPO2 pin. See below for details.
GPO2:
-general-purpose output controlled by GPO2 user bit
-DDR3 reset output signal. Signal is controlled by GPIO1 and PGOOD.
 See below for details.
-Output buffer can be configured as open-drain or push-pull.
GPIO3:
-general-purpose, open-drain output controlled by GPO3 user bit and/or
 sequencer
-reset input-signal for DCDC1 and DCDC2.

The input configurations are not meant to be used by the user so the driver
only offers GPOs.

v2: Added request routine that evaluates the fw config flags and removed module
owner

Signed-off-by: Nicolas Saenz Julienne 
---
 drivers/gpio/Kconfig |   7 ++
 drivers/gpio/Makefile|   1 +
 drivers/gpio/gpio-tps65218.c | 217 +++
 3 files changed, 225 insertions(+)
 create mode 100644 drivers/gpio/gpio-tps65218.c

diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index 597b8d4..70c6c79 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -822,6 +822,13 @@ config GPIO_TIMBERDALE
---help---
Add support for the GPIO IP in the timberdale FPGA.
 
+config GPIO_TPS65218
+   tristate "TPS65218 GPIO"
+   depends on MFD_TPS65218
+   help
+ Select this option to enable GPIO driver for the TPS65218
+ chip family.
+
 config GPIO_TPS6586X
bool "TPS6586X GPIO"
depends on MFD_TPS6586X
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index 77a07e9..d4bd2f9 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -93,6 +93,7 @@ obj-$(CONFIG_GPIO_TC3589X)+= gpio-tc3589x.o
 obj-$(CONFIG_ARCH_TEGRA)   += gpio-tegra.o
 obj-$(CONFIG_GPIO_TIMBERDALE)  += gpio-timberdale.o
 obj-$(CONFIG_GPIO_PALMAS)  += gpio-palmas.o
+obj-$(CONFIG_GPIO_TPS65218)+= gpio-tps65218.o
 obj-$(CONFIG_GPIO_TPS6586X)+= gpio-tps6586x.o
 obj-$(CONFIG_GPIO_TPS65910)+= gpio-tps65910.o
 obj-$(CONFIG_GPIO_TPS65912)+= gpio-tps65912.o
diff --git a/drivers/gpio/gpio-tps65218.c b/drivers/gpio/gpio-tps65218.c
new file mode 100644
index 000..f15a142
--- /dev/null
+++ b/drivers/gpio/gpio-tps65218.c
@@ -0,0 +1,217 @@
+/*
+ * Copyright 2015 Verifone Int.
+ *
+ * Author: Nicolas Saenz Julienne 
+ *
+ * This program is free software; you can redistribute it and/or modify i t
+ * under  the terms of the GNU General  Public License as published by th e
+ * Free Software Foundation;  either version 2 of the License, or (at you r
+ * option) any later version.
+ *
+ * This driver is based on the gpio-tps65912 implementation.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include "gpiolib.h"
+
+struct tps65218_gpio {
+   struct tps65218 *tps65218;
+   struct gpio_chip gpio_chip;
+};
+
+#define to_tg(gc)  container_of(gc, struct tps65218_gpio, gpio_chip)
+
+static int tps65218_gpio_get(struct gpio_chip *gc, unsigned offset)
+{
+   struct tps65218_gpio *tps65218_gpio = to_tg(gc);
+   struct tps65218 *tps65218 = tps65218_gpio->tps65218;
+   unsigned int val;
+   int ret;
+
+   ret = tps65218_reg_read(tps65218, TPS65218_REG_ENABLE2, );
+   if (ret)
+   return ret;
+
+   return val & (TPS65218_ENABLE2_GPIO1 << offset);
+}
+
+static void tps65218_gpio_set(struct gpio_chip *gc, unsigned offset,
+ int value)
+{
+   struct tps65218_gpio *tps65218_gpio = to_tg(gc);
+   struct tps65218 *tps65218 = tps65218_gpio->tps65218;
+
+   if (value)
+   tps65218_set_bits(tps65218, TPS65218_REG_ENABLE2,
+ TPS65218_ENABLE2_GPIO1 << offset,
+ TPS65218_ENABLE2_GPIO1 << offset,
+ TPS65218_PROTECT_L1);
+   else
+   tps65218_clear_bits(tps65218, TPS65218_REG_ENABLE2,
+   TPS65218_ENABLE2_GPIO1 << offset,
+   TPS65218_PROTECT_L1);
+}
+
+static int tps65218_gpio_output(struct gpio_chip *gc, unsigned offset,
+   int value)
+{
+   /* Only drives GPOs */
+   return 0;
+}
+
+static int tps65218_gpio_request(struct gpio_chip *gc, unsigned offset)
+{
+   struct tps65218_gpio *tps65218_gpio = to_tg(gc);
+   struct tps65218 *tps65218 = tps65218_gpio->tps65218;
+   unsigned long flags = gc->desc->flags;
+   int ret;
+
+   if (flags & FLAG_OPEN_SOURCE) {
+   dev_err(gc->dev, "can't work as open source\n");
+   return -EINVAL;
+   }
+
+   switch (offset) {
+   case 0:
+   if 

[PATCH] gpio: add tps65218 gpio driver

2015-10-23 Thread Nicolas Saenz Julienne
Driver for the GPIO block found in ti's tps65218 pmics.

The device has two GPIOs and one GPO pin which can be configured as follows:
GPIO1:
-general-purpose, open-drain output controlled by GPO1 user bit and/or
 sequencer
-DDR3 reset input signal from SOC. Signal is either latched or
 passed-trough to GPO2 pin. See below for details.
GPO2:
-general-purpose output controlled by GPO2 user bit
-DDR3 reset output signal. Signal is controlled by GPIO1 and PGOOD.
 See below for details.
-Output buffer can be configured as open-drain or push-pull.
GPIO3:
-general-purpose, open-drain output controlled by GPO3 user bit and/or
 sequencer
-reset input-signal for DCDC1 and DCDC2.

The input configurations are not meant to be used by the user so the driver
only offers GPOs.

v2: Added request routine that evaluates the fw config flags and removed module
owner

Signed-off-by: Nicolas Saenz Julienne 
---
 drivers/gpio/Kconfig |   7 ++
 drivers/gpio/Makefile|   1 +
 drivers/gpio/gpio-tps65218.c | 217 +++
 3 files changed, 225 insertions(+)
 create mode 100644 drivers/gpio/gpio-tps65218.c

diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index 597b8d4..70c6c79 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -822,6 +822,13 @@ config GPIO_TIMBERDALE
---help---
Add support for the GPIO IP in the timberdale FPGA.
 
+config GPIO_TPS65218
+   tristate "TPS65218 GPIO"
+   depends on MFD_TPS65218
+   help
+ Select this option to enable GPIO driver for the TPS65218
+ chip family.
+
 config GPIO_TPS6586X
bool "TPS6586X GPIO"
depends on MFD_TPS6586X
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index 77a07e9..d4bd2f9 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -93,6 +93,7 @@ obj-$(CONFIG_GPIO_TC3589X)+= gpio-tc3589x.o
 obj-$(CONFIG_ARCH_TEGRA)   += gpio-tegra.o
 obj-$(CONFIG_GPIO_TIMBERDALE)  += gpio-timberdale.o
 obj-$(CONFIG_GPIO_PALMAS)  += gpio-palmas.o
+obj-$(CONFIG_GPIO_TPS65218)+= gpio-tps65218.o
 obj-$(CONFIG_GPIO_TPS6586X)+= gpio-tps6586x.o
 obj-$(CONFIG_GPIO_TPS65910)+= gpio-tps65910.o
 obj-$(CONFIG_GPIO_TPS65912)+= gpio-tps65912.o
diff --git a/drivers/gpio/gpio-tps65218.c b/drivers/gpio/gpio-tps65218.c
new file mode 100644
index 000..f15a142
--- /dev/null
+++ b/drivers/gpio/gpio-tps65218.c
@@ -0,0 +1,217 @@
+/*
+ * Copyright 2015 Verifone Int.
+ *
+ * Author: Nicolas Saenz Julienne 
+ *
+ * This program is free software; you can redistribute it and/or modify i t
+ * under  the terms of the GNU General  Public License as published by th e
+ * Free Software Foundation;  either version 2 of the License, or (at you r
+ * option) any later version.
+ *
+ * This driver is based on the gpio-tps65912 implementation.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include "gpiolib.h"
+
+struct tps65218_gpio {
+   struct tps65218 *tps65218;
+   struct gpio_chip gpio_chip;
+};
+
+#define to_tg(gc)  container_of(gc, struct tps65218_gpio, gpio_chip)
+
+static int tps65218_gpio_get(struct gpio_chip *gc, unsigned offset)
+{
+   struct tps65218_gpio *tps65218_gpio = to_tg(gc);
+   struct tps65218 *tps65218 = tps65218_gpio->tps65218;
+   unsigned int val;
+   int ret;
+
+   ret = tps65218_reg_read(tps65218, TPS65218_REG_ENABLE2, );
+   if (ret)
+   return ret;
+
+   return val & (TPS65218_ENABLE2_GPIO1 << offset);
+}
+
+static void tps65218_gpio_set(struct gpio_chip *gc, unsigned offset,
+ int value)
+{
+   struct tps65218_gpio *tps65218_gpio = to_tg(gc);
+   struct tps65218 *tps65218 = tps65218_gpio->tps65218;
+
+   if (value)
+   tps65218_set_bits(tps65218, TPS65218_REG_ENABLE2,
+ TPS65218_ENABLE2_GPIO1 << offset,
+ TPS65218_ENABLE2_GPIO1 << offset,
+ TPS65218_PROTECT_L1);
+   else
+   tps65218_clear_bits(tps65218, TPS65218_REG_ENABLE2,
+   TPS65218_ENABLE2_GPIO1 << offset,
+   TPS65218_PROTECT_L1);
+}
+
+static int tps65218_gpio_output(struct gpio_chip *gc, unsigned offset,
+   int value)
+{
+   /* Only drives GPOs */
+   return 0;
+}
+
+static int tps65218_gpio_request(struct gpio_chip *gc, unsigned offset)
+{
+   struct tps65218_gpio *tps65218_gpio = to_tg(gc);
+   struct tps65218 *tps65218 = tps65218_gpio->tps65218;
+   unsigned long flags = gc->desc->flags;
+   int ret;
+
+   if (flags & FLAG_OPEN_SOURCE) {
+   dev_err(gc->dev, "can't work as open source\n");
+   return -EINVAL;
+   }
+
+   switch 

Re: [PATCH] gpio: add tps65218 gpio driver

2015-10-16 Thread Linus Walleij
On Sun, Oct 11, 2015 at 6:41 PM, Nicolas Saenz Julienne
 wrote:

> Driver for the GPIO block found in ti's tps65218 pmics.
>
> The device has two GPIOs and one GPO pin which can be configured as follows:
> GPIO1:
> -general-purpose, open-drain output controlled by GPO1 user bit and/or
>  sequencer
> -DDR3 reset input signal from SOC. Signal is either latched or
>  passed-trough to GPO2 pin. See below for details.
> GPO2:
> -general-purpose output controlled by GPO2 user bit
> -DDR3 reset output signal. Signal is controlled by GPIO1 and PGOOD.
>  See below for details.
> -Output buffer can be configured as open-drain or push-pull.
> GPIO3:
> -general-purpose, open-drain output controlled by GPO3 user bit and/or
>  sequencer
> -reset input-signal for DCDC1 and DCDC2.
>
> The input configurations are not meant to be used by the user so the driver
> only offers GPOs. Also GPO2 is set-up as open drain by default.
>
> Signed-off-by: Nicolas Saenz Julienne 

It seems we are currently seeing an influx of drivers that can selectively
enable open drain on some pins. Can you please look at the
patches submitted by Laurent Pinchart for this so we get a
generic solution that works for everyone.

It's important that consumers can request open drain from
descriptor tables or device trees and that the driver says "no"
if this can not be satisfied.

Yours,
Linus Walleij
--
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/


Re: [PATCH] gpio: add tps65218 gpio driver

2015-10-16 Thread Linus Walleij
On Sun, Oct 11, 2015 at 6:41 PM, Nicolas Saenz Julienne
 wrote:

> Driver for the GPIO block found in ti's tps65218 pmics.
>
> The device has two GPIOs and one GPO pin which can be configured as follows:
> GPIO1:
> -general-purpose, open-drain output controlled by GPO1 user bit and/or
>  sequencer
> -DDR3 reset input signal from SOC. Signal is either latched or
>  passed-trough to GPO2 pin. See below for details.
> GPO2:
> -general-purpose output controlled by GPO2 user bit
> -DDR3 reset output signal. Signal is controlled by GPIO1 and PGOOD.
>  See below for details.
> -Output buffer can be configured as open-drain or push-pull.
> GPIO3:
> -general-purpose, open-drain output controlled by GPO3 user bit and/or
>  sequencer
> -reset input-signal for DCDC1 and DCDC2.
>
> The input configurations are not meant to be used by the user so the driver
> only offers GPOs. Also GPO2 is set-up as open drain by default.
>
> Signed-off-by: Nicolas Saenz Julienne 

It seems we are currently seeing an influx of drivers that can selectively
enable open drain on some pins. Can you please look at the
patches submitted by Laurent Pinchart for this so we get a
generic solution that works for everyone.

It's important that consumers can request open drain from
descriptor tables or device trees and that the driver says "no"
if this can not be satisfied.

Yours,
Linus Walleij
--
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/


Re: [PATCH] gpio: add tps65218 gpio driver

2015-10-11 Thread kbuild test robot
Hi Nicolas,

[auto build test WARNING on gpio/for-next -- if it's inappropriate base, please 
ignore]


coccinelle warnings: (new ones prefixed by >>)

>> drivers/gpio/gpio-tps65218.c:153:3-8: No need to set .owner here. The core 
>> will do it.

Please review and possibly fold the followup patch.

---
0-DAY kernel test infrastructureOpen Source Technology Center
https://lists.01.org/pipermail/kbuild-all   Intel Corporation
--
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/


[PATCH] gpio: add tps65218 gpio driver

2015-10-11 Thread Nicolas Saenz Julienne
Driver for the GPIO block found in ti's tps65218 pmics.

The device has two GPIOs and one GPO pin which can be configured as follows:
GPIO1:
-general-purpose, open-drain output controlled by GPO1 user bit and/or
 sequencer
-DDR3 reset input signal from SOC. Signal is either latched or
 passed-trough to GPO2 pin. See below for details.
GPO2:
-general-purpose output controlled by GPO2 user bit
-DDR3 reset output signal. Signal is controlled by GPIO1 and PGOOD.
 See below for details.
-Output buffer can be configured as open-drain or push-pull.
GPIO3:
-general-purpose, open-drain output controlled by GPO3 user bit and/or
 sequencer
-reset input-signal for DCDC1 and DCDC2.

The input configurations are not meant to be used by the user so the driver
only offers GPOs. Also GPO2 is set-up as open drain by default.

Signed-off-by: Nicolas Saenz Julienne 
---
 drivers/gpio/Kconfig |   7 ++
 drivers/gpio/Makefile|   1 +
 drivers/gpio/gpio-tps65218.c | 165 +++
 3 files changed, 173 insertions(+)
 create mode 100644 drivers/gpio/gpio-tps65218.c

diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index 63000b1..1669898 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -822,6 +822,13 @@ config GPIO_TIMBERDALE
---help---
Add support for the GPIO IP in the timberdale FPGA.
 
+config GPIO_TPS65218
+   tristate "TPS65218 GPIO"
+   depends on MFD_TPS65218
+   help
+ Select this option to enable GPIO driver for the TPS65218
+ chip family.
+
 config GPIO_TPS6586X
bool "TPS6586X GPIO"
depends on MFD_TPS6586X
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index 77a07e9..d4bd2f9 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -93,6 +93,7 @@ obj-$(CONFIG_GPIO_TC3589X)+= gpio-tc3589x.o
 obj-$(CONFIG_ARCH_TEGRA)   += gpio-tegra.o
 obj-$(CONFIG_GPIO_TIMBERDALE)  += gpio-timberdale.o
 obj-$(CONFIG_GPIO_PALMAS)  += gpio-palmas.o
+obj-$(CONFIG_GPIO_TPS65218)+= gpio-tps65218.o
 obj-$(CONFIG_GPIO_TPS6586X)+= gpio-tps6586x.o
 obj-$(CONFIG_GPIO_TPS65910)+= gpio-tps65910.o
 obj-$(CONFIG_GPIO_TPS65912)+= gpio-tps65912.o
diff --git a/drivers/gpio/gpio-tps65218.c b/drivers/gpio/gpio-tps65218.c
new file mode 100644
index 000..a0b3d52
--- /dev/null
+++ b/drivers/gpio/gpio-tps65218.c
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2015 Verifone Int.
+ *
+ * Author: Nicolas Saenz Julienne 
+ *
+ * This program is free software; you can redistribute it and/or modify i t
+ * under  the terms of the GNU General  Public License as published by th e
+ * Free Software Foundation;  either version 2 of the License, or (at you r
+ * option) any later version.
+ *
+ * This driver is based on the gpio-tps65912 implementation.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+struct tps65218_gpio {
+   struct tps65218 *tps65218;
+   struct gpio_chip gpio_chip;
+};
+
+#define to_tg(gc)  container_of(gc, struct tps65218_gpio, gpio_chip)
+
+static int tps65218_gpio_get(struct gpio_chip *gc, unsigned offset)
+{
+   struct tps65218_gpio *tps65218_gpio = to_tg(gc);
+   struct tps65218 *tps65218 = tps65218_gpio->tps65218;
+   unsigned int val;
+   int ret;
+
+   ret = tps65218_reg_read(tps65218, TPS65218_REG_ENABLE2, );
+   if (ret)
+   return ret;
+
+   return val & (TPS65218_ENABLE2_GPIO1 << offset);
+}
+
+static void tps65218_gpio_set(struct gpio_chip *gc, unsigned offset,
+ int value)
+{
+   struct tps65218_gpio *tps65218_gpio = to_tg(gc);
+   struct tps65218 *tps65218 = tps65218_gpio->tps65218;
+
+   if (value)
+   tps65218_set_bits(tps65218, TPS65218_REG_ENABLE2,
+ TPS65218_ENABLE2_GPIO1 << offset,
+ TPS65218_ENABLE2_GPIO1 << offset,
+ TPS65218_PROTECT_L1);
+   else
+   tps65218_clear_bits(tps65218, TPS65218_REG_ENABLE2,
+   TPS65218_ENABLE2_GPIO1 << offset,
+   TPS65218_PROTECT_L1);
+}
+
+static int tps65218_gpio_output(struct gpio_chip *gc, unsigned offset,
+   int value)
+{
+   /* Only drives GPOs */
+   return 0;
+}
+
+static struct gpio_chip template_chip = {
+   .label  = "gpio-tps65218",
+   .owner  = THIS_MODULE,
+   .direction_output   = tps65218_gpio_output,
+   .get= tps65218_gpio_get,
+   .set= tps65218_gpio_set,
+   .can_sleep  = true,
+   .ngpio  = 3,
+   .base   = -1,
+};
+
+static int tps65218_setup_gpos(struct tps65218_gpio *tps65218_gpio)
+{
+   struct tps65218 *tps65218 = 

Re: [PATCH] gpio: add tps65218 gpio driver

2015-10-11 Thread kbuild test robot
Hi Nicolas,

[auto build test WARNING on gpio/for-next -- if it's inappropriate base, please 
ignore]


coccinelle warnings: (new ones prefixed by >>)

>> drivers/gpio/gpio-tps65218.c:153:3-8: No need to set .owner here. The core 
>> will do it.

Please review and possibly fold the followup patch.

---
0-DAY kernel test infrastructureOpen Source Technology Center
https://lists.01.org/pipermail/kbuild-all   Intel Corporation
--
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/


[PATCH] gpio: add tps65218 gpio driver

2015-10-11 Thread Nicolas Saenz Julienne
Driver for the GPIO block found in ti's tps65218 pmics.

The device has two GPIOs and one GPO pin which can be configured as follows:
GPIO1:
-general-purpose, open-drain output controlled by GPO1 user bit and/or
 sequencer
-DDR3 reset input signal from SOC. Signal is either latched or
 passed-trough to GPO2 pin. See below for details.
GPO2:
-general-purpose output controlled by GPO2 user bit
-DDR3 reset output signal. Signal is controlled by GPIO1 and PGOOD.
 See below for details.
-Output buffer can be configured as open-drain or push-pull.
GPIO3:
-general-purpose, open-drain output controlled by GPO3 user bit and/or
 sequencer
-reset input-signal for DCDC1 and DCDC2.

The input configurations are not meant to be used by the user so the driver
only offers GPOs. Also GPO2 is set-up as open drain by default.

Signed-off-by: Nicolas Saenz Julienne 
---
 drivers/gpio/Kconfig |   7 ++
 drivers/gpio/Makefile|   1 +
 drivers/gpio/gpio-tps65218.c | 165 +++
 3 files changed, 173 insertions(+)
 create mode 100644 drivers/gpio/gpio-tps65218.c

diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index 63000b1..1669898 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -822,6 +822,13 @@ config GPIO_TIMBERDALE
---help---
Add support for the GPIO IP in the timberdale FPGA.
 
+config GPIO_TPS65218
+   tristate "TPS65218 GPIO"
+   depends on MFD_TPS65218
+   help
+ Select this option to enable GPIO driver for the TPS65218
+ chip family.
+
 config GPIO_TPS6586X
bool "TPS6586X GPIO"
depends on MFD_TPS6586X
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index 77a07e9..d4bd2f9 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -93,6 +93,7 @@ obj-$(CONFIG_GPIO_TC3589X)+= gpio-tc3589x.o
 obj-$(CONFIG_ARCH_TEGRA)   += gpio-tegra.o
 obj-$(CONFIG_GPIO_TIMBERDALE)  += gpio-timberdale.o
 obj-$(CONFIG_GPIO_PALMAS)  += gpio-palmas.o
+obj-$(CONFIG_GPIO_TPS65218)+= gpio-tps65218.o
 obj-$(CONFIG_GPIO_TPS6586X)+= gpio-tps6586x.o
 obj-$(CONFIG_GPIO_TPS65910)+= gpio-tps65910.o
 obj-$(CONFIG_GPIO_TPS65912)+= gpio-tps65912.o
diff --git a/drivers/gpio/gpio-tps65218.c b/drivers/gpio/gpio-tps65218.c
new file mode 100644
index 000..a0b3d52
--- /dev/null
+++ b/drivers/gpio/gpio-tps65218.c
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2015 Verifone Int.
+ *
+ * Author: Nicolas Saenz Julienne 
+ *
+ * This program is free software; you can redistribute it and/or modify i t
+ * under  the terms of the GNU General  Public License as published by th e
+ * Free Software Foundation;  either version 2 of the License, or (at you r
+ * option) any later version.
+ *
+ * This driver is based on the gpio-tps65912 implementation.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+struct tps65218_gpio {
+   struct tps65218 *tps65218;
+   struct gpio_chip gpio_chip;
+};
+
+#define to_tg(gc)  container_of(gc, struct tps65218_gpio, gpio_chip)
+
+static int tps65218_gpio_get(struct gpio_chip *gc, unsigned offset)
+{
+   struct tps65218_gpio *tps65218_gpio = to_tg(gc);
+   struct tps65218 *tps65218 = tps65218_gpio->tps65218;
+   unsigned int val;
+   int ret;
+
+   ret = tps65218_reg_read(tps65218, TPS65218_REG_ENABLE2, );
+   if (ret)
+   return ret;
+
+   return val & (TPS65218_ENABLE2_GPIO1 << offset);
+}
+
+static void tps65218_gpio_set(struct gpio_chip *gc, unsigned offset,
+ int value)
+{
+   struct tps65218_gpio *tps65218_gpio = to_tg(gc);
+   struct tps65218 *tps65218 = tps65218_gpio->tps65218;
+
+   if (value)
+   tps65218_set_bits(tps65218, TPS65218_REG_ENABLE2,
+ TPS65218_ENABLE2_GPIO1 << offset,
+ TPS65218_ENABLE2_GPIO1 << offset,
+ TPS65218_PROTECT_L1);
+   else
+   tps65218_clear_bits(tps65218, TPS65218_REG_ENABLE2,
+   TPS65218_ENABLE2_GPIO1 << offset,
+   TPS65218_PROTECT_L1);
+}
+
+static int tps65218_gpio_output(struct gpio_chip *gc, unsigned offset,
+   int value)
+{
+   /* Only drives GPOs */
+   return 0;
+}
+
+static struct gpio_chip template_chip = {
+   .label  = "gpio-tps65218",
+   .owner  = THIS_MODULE,
+   .direction_output   = tps65218_gpio_output,
+   .get= tps65218_gpio_get,
+   .set= tps65218_gpio_set,
+   .can_sleep  = true,
+   .ngpio  = 3,
+   .base   = -1,
+};
+
+static int tps65218_setup_gpos(struct tps65218_gpio *tps65218_gpio)