Skip to contentSkip to conversation

gpio: pca953x: Introduce a long awaited ->get_direction()

PATCH In review Andy Shevchenko 2 participants 8 messages Mar 22, 2017 – Mar 23, 2017 GPIO

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/3 gpio: pca953x: Introduce a long awaited ->get_direction()

Introduce ->get_direction() callback for the driver.

---
v2: fix direction (0 for out, 1 for in)

 drivers/gpio/gpio-pca953x.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)
drivers/gpio/gpio-pca953x.c +16 -0
index d44232aadb6c..c149054ef976 100644
@@ -363,6 +363,21 @@ static void pca953x_gpio_set_value(struct gpio_chip *gc, unsigned off, int val)
 	mutex_unlock(&chip->i2c_lock);
 }
 
+static int pca953x_gpio_get_direction(struct gpio_chip *gc, unsigned off)
+{
+	struct pca953x_chip *chip = gpiochip_get_data(gc);
+	u32 reg_val;
+	int ret;
+
+	mutex_lock(&chip->i2c_lock);
+	ret = pca953x_read_single(chip, chip->regs->direction, &reg_val, off);
+	mutex_unlock(&chip->i2c_lock);
+	if (ret < 0)
+		return ret;
+
+	return (reg_val & (1u << (off % BANK_SZ))) ? GPIOF_DIR_IN : GPIOF_DIR_OUT;
+}
+
 static void pca953x_gpio_set_multiple(struct gpio_chip *gc,
 				      unsigned long *mask, unsigned long *bits)
 {
@@ -408,6 +423,7 @@ static void pca953x_setup_gpio(struct pca953x_chip *chip, int gpios)
 	gc->direction_output = pca953x_gpio_direction_output;
 	gc->get = pca953x_gpio_get_value;
 	gc->set = pca953x_gpio_set_value;
+	gc->get_direction = pca953x_gpio_get_direction;
 	gc->set_multiple = pca953x_gpio_set_multiple;
 	gc->can_sleep = true;
 
Signature · 1 line
2.11.0
#1 lore raw

PATCH v2 2/3 gpio: pca953x: Sort headers alphabetically

For sake of better maintenance sort the headers by alphabetical order.

---
 drivers/gpio/gpio-pca953x.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/gpio/gpio-pca953x.c +7 -6
index c149054ef976..cfee792182ab 100644
@@ -11,18 +11,19 @@
  *  the Free Software Foundation; version 2 of the License.
  */
 
-#include <linux/module.h>
-#include <linux/init.h>
+#include <linux/acpi.h>
 #include <linux/gpio.h>
 #include <linux/gpio/consumer.h>
-#include <linux/interrupt.h>
 #include <linux/i2c.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/module.h>
+#include <linux/of_platform.h>
 #include <linux/platform_data/pca953x.h>
+#include <linux/regulator/consumer.h>
 #include <linux/slab.h>
+
 #include <asm/unaligned.h>
-#include <linux/of_platform.h>
-#include <linux/acpi.h>
-#include <linux/regulator/consumer.h>
 
 #define PCA953X_INPUT		0
 #define PCA953X_OUTPUT		1
Signature · 1 line
2.11.0
#2 lore raw

Re: [PATCH v2 2/3] gpio: pca953x: Sort headers alphabetically

Quoted 3 lines · Andy Shevchenko

For sake of better maintenance sort the headers by alphabetical order.

Patch applied.

Unrelated:

Quoted 2 lines

#include <linux/gpio.h>
#include <linux/gpio/consumer.h>

#include <linux/gpio/driver.h> should normally be all that is needed.

Yours,
Linus Walleij

#3 lore raw

Re: [PATCH v2 2/3] gpio: pca953x: Sort headers alphabetically

Quoted 8 lines · Linus Walleij
Quoted 4 lines · Andy Shevchenko

For sake of better maintenance sort the headers by alphabetical order.

Quoted 8 lines

Patch applied.

Unrelated:

Quoted 2 lines

 #include <linux/gpio.h>
 #include <linux/gpio/consumer.h>

#include <linux/gpio/driver.h> should normally be all that is needed.

Noted for the future, thanks!

Signature · 2 lines
Andy Shevchenko <[email protected]>
Intel Finland Oy
#4 lore raw

PATCH v2 3/3 gpio: pca953x: Expand comment for "reset" GPIO in ACPI case

In reply to Andy Shevchenko

GPIO ACPI library is going to be stricter about resources, thus, expand comment regarding "reset" GPIO resource in this driver to clarify its usage in ACPI case.

---
 drivers/gpio/gpio-pca953x.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/gpio/gpio-pca953x.c +7 -1
index cfee792182ab..d8eddc9b7af0 100644
@@ -777,7 +777,13 @@ static int pca953x_probe(struct i2c_client *client,
 		chip->gpio_start = -1;
 		irq_base = 0;
 
-		/* See if we need to de-assert a reset pin */
+		/*
+		 * See if we need to de-assert a reset pin.
+		 *
+		 * There is no known ACPI-enabled platforms that are
+		 * using "reset" GPIO. Otherwise any of those platform
+		 * must use _DSD method with corresponding property.
+		 */
 		reset_gpio = devm_gpiod_get_optional(&client->dev, "reset",
 						     GPIOD_OUT_LOW);
 		if (IS_ERR(reset_gpio))
Signature · 1 line
2.11.0
#5 lore raw

Re: [PATCH v2 3/3] gpio: pca953x: Expand comment for "reset" GPIO in ACPI case

Quoted 5 lines · Andy Shevchenko

GPIO ACPI library is going to be stricter about resources, thus, expand comment regarding "reset" GPIO resource in this driver to clarify its usage in ACPI case.

Patch applied.

Yours,
Linus Walleij

#7 lore raw
In reply to Andy Shevchenko
Quoted 1 line · Andy Shevchenko

+ return (reg_val & (1u << (off % BANK_SZ))) ? GPIOF_DIR_IN : GPIOF_DIR_OUT;

The GPIOF_DIR_IN/GPIOF_DIR_OUT are part of the consumer API and should not be used inside drivers.

I've fixed it up to 1/0 when applying.

Yours,
Linus Walleij