Skip to contentSkip to conversation

gpiolib: of: Improve gpiolib-of support pull up/down on expanders

PATCH In review Adam Ford 2 participants 4 messages Apr 12, 2020 – Apr 15, 2020 GPIO

lore
Share & tools
lore

Adam Ford

author
#0 lore raw

PATCH 1/2 gpiolib: of: Improve gpiolib-of support pull up/down on expanders

When using GPIO expanders attached to I2C ports, their set_config function needs to be passed a config setting which contains options to enable pull up or pull down bias feature. In order to set this config properly, the gpio parser needs to handle GPIO_PULL_UP and GPIO_PULL_DOWN.

This patch enables the flags corresponding to GPIO_PULL_UP and GPIO_PULL_DOWN.

drivers/gpio/gpiolib-of.c +10 -0
index c6d30f73df07..bf17afb1f66d 100644
@@ -344,6 +344,12 @@ struct gpio_desc *gpiod_get_from_of_node(struct device_node *node,
 	if (transitory)
 		lflags |= GPIO_TRANSITORY;
 
+	if (flags & OF_GPIO_PULL_UP)
+		lflags |= GPIO_PULL_UP;
+
+	if (flags & OF_GPIO_PULL_DOWN)
+		lflags |= GPIO_PULL_DOWN;
+
 	ret = gpiod_configure_flags(desc, propname, lflags, dflags);
 	if (ret < 0) {
 		gpiod_put(desc);
@@ -585,6 +591,10 @@ static struct gpio_desc *of_parse_own_gpio(struct device_node *np,
 		*lflags |= GPIO_ACTIVE_LOW;
 	if (xlate_flags & OF_GPIO_TRANSITORY)
 		*lflags |= GPIO_TRANSITORY;
+	if (xlate_flags & OF_GPIO_PULL_UP)
+		*lflags |= GPIO_PULL_UP;
+	if (xlate_flags & OF_GPIO_PULL_DOWN)
+		*lflags |= GPIO_PULL_DOWN;
 
 	if (of_property_read_bool(np, "input"))
 		*dflags |= GPIOD_IN;
Signature · 1 line
2.25.1
author
#1 lore raw

PATCH 2/2 gpio: pca953x: Fix pca953x_gpio_set_config

pca953x_gpio_set_config is setup to support pull-up/down bias. Currently the driver uses a variable called 'config' to determine which options to use. Unfortunately, this is incorrect.

This patch uses function pinconf_to_config_param(config), which converts this 'config' parameter back to pinconfig to determine which option to use.

Fixes 15add06841a3 ("gpio: pca953x: add ->set_config implementation")
drivers/gpio/gpio-pca953x.c +1 -1
index 5638b4e5355f..4269ea9a817e 100644
@@ -531,7 +531,7 @@ static int pca953x_gpio_set_config(struct gpio_chip *gc, unsigned int offset,
 {
 	struct pca953x_chip *chip = gpiochip_get_data(gc);
 
-	switch (config) {
+	switch (pinconf_to_config_param(config)) {
 	case PIN_CONFIG_BIAS_PULL_UP:
 	case PIN_CONFIG_BIAS_PULL_DOWN:
 		return pca953x_gpio_set_pull_up_down(chip, offset, config);
Signature · 1 line
2.25.1
#2 lore raw

Re: [PATCH 2/2] gpio: pca953x: Fix pca953x_gpio_set_config

niedz., 12 kwi 2020 o 03:34 Adam Ford <[email protected]> napisał(a):

Quoted 27 lines

pca953x_gpio_set_config is setup to support pull-up/down bias. Currently the driver uses a variable called 'config' to determine which options to use. Unfortunately, this is incorrect.

This patch uses function pinconf_to_config_param(config), which converts this 'config' parameter back to pinconfig to determine which option to use.

Fixes 15add06841a3 ("gpio: pca953x: add ->set_config implementation")
drivers/gpio/gpio-pca953x.c +1 -2
index 5638b4e5355f..4269ea9a817e 100644
@@ -531,7 +531,7 @@ static int pca953x_gpio_set_config(struct gpio_chip *gc, unsigned int offset,
 {
        struct pca953x_chip *chip = gpiochip_get_data(gc);
 
-       switch (config) {
+       switch (pinconf_to_config_param(config)) {
        case PIN_CONFIG_BIAS_PULL_UP:
        case PIN_CONFIG_BIAS_PULL_DOWN:
                return pca953x_gpio_set_pull_up_down(chip, offset, config);
--
Quoted 2 lines

2.25.1

Patch applied for fixes, thanks!

Bart

#3 lore raw
In reply to Adam Ford

niedz., 12 kwi 2020 o 03:34 Adam Ford <[email protected]> napisał(a):

Quoted 40 lines

When using GPIO expanders attached to I2C ports, their set_config function needs to be passed a config setting which contains options to enable pull up or pull down bias feature. In order to set this config properly, the gpio parser needs to handle GPIO_PULL_UP and GPIO_PULL_DOWN.

This patch enables the flags corresponding to GPIO_PULL_UP and GPIO_PULL_DOWN.

drivers/gpio/gpiolib-of.c +10 -1
index c6d30f73df07..bf17afb1f66d 100644
@@ -344,6 +344,12 @@ struct gpio_desc *gpiod_get_from_of_node(struct device_node *node,
        if (transitory)
                lflags |= GPIO_TRANSITORY;
 
+       if (flags & OF_GPIO_PULL_UP)
+               lflags |= GPIO_PULL_UP;
+
+       if (flags & OF_GPIO_PULL_DOWN)
+               lflags |= GPIO_PULL_DOWN;
+
        ret = gpiod_configure_flags(desc, propname, lflags, dflags);
        if (ret < 0) {
                gpiod_put(desc);
@@ -585,6 +591,10 @@ static struct gpio_desc *of_parse_own_gpio(struct device_node *np,
                *lflags |= GPIO_ACTIVE_LOW;
        if (xlate_flags & OF_GPIO_TRANSITORY)
                *lflags |= GPIO_TRANSITORY;
+       if (xlate_flags & OF_GPIO_PULL_UP)
+               *lflags |= GPIO_PULL_UP;
+       if (xlate_flags & OF_GPIO_PULL_DOWN)
+               *lflags |= GPIO_PULL_DOWN;
 
        if (of_property_read_bool(np, "input"))
                *dflags |= GPIOD_IN;
--
Quoted 2 lines

2.25.1

Patch applied, thanks!

Bart