Commit e3186e36 authored by Dmitry Torokhov's avatar Dmitry Torokhov Committed by Bartosz Golaszewski

gpiolib: of: factor out code overriding gpio line polarity

There are several instances where we use a separate property to
override polarity specified in gpio property. Factor it out into
a separate function.
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: default avatarBartosz Golaszewski <bartosz.golaszewski@linaro.org>
parent eaf1a296
...@@ -130,6 +130,28 @@ bool of_gpio_need_valid_mask(const struct gpio_chip *gc) ...@@ -130,6 +130,28 @@ bool of_gpio_need_valid_mask(const struct gpio_chip *gc)
return false; return false;
} }
/*
* Overrides stated polarity of a gpio line and warns when there is a
* discrepancy.
*/
static void of_gpio_quirk_polarity(const struct device_node *np,
bool active_high,
enum of_gpio_flags *flags)
{
if (active_high) {
if (*flags & OF_GPIO_ACTIVE_LOW) {
pr_warn("%s GPIO handle specifies active low - ignored\n",
of_node_full_name(np));
*flags &= ~OF_GPIO_ACTIVE_LOW;
}
} else {
if (!(*flags & OF_GPIO_ACTIVE_LOW))
pr_info("%s enforce active low on GPIO handle\n",
of_node_full_name(np));
*flags |= OF_GPIO_ACTIVE_LOW;
}
}
static void of_gpio_flags_quirks(const struct device_node *np, static void of_gpio_flags_quirks(const struct device_node *np,
const char *propname, const char *propname,
enum of_gpio_flags *flags, enum of_gpio_flags *flags,
...@@ -145,7 +167,7 @@ static void of_gpio_flags_quirks(const struct device_node *np, ...@@ -145,7 +167,7 @@ static void of_gpio_flags_quirks(const struct device_node *np,
(!(strcmp(propname, "enable-gpio") && (!(strcmp(propname, "enable-gpio") &&
strcmp(propname, "enable-gpios")) && strcmp(propname, "enable-gpios")) &&
of_device_is_compatible(np, "regulator-gpio")))) { of_device_is_compatible(np, "regulator-gpio")))) {
bool active_low = !of_property_read_bool(np, bool active_high = of_property_read_bool(np,
"enable-active-high"); "enable-active-high");
/* /*
* The regulator GPIO handles are specified such that the * The regulator GPIO handles are specified such that the
...@@ -153,13 +175,7 @@ static void of_gpio_flags_quirks(const struct device_node *np, ...@@ -153,13 +175,7 @@ static void of_gpio_flags_quirks(const struct device_node *np,
* the polarity of the GPIO line. Any phandle flags must * the polarity of the GPIO line. Any phandle flags must
* be actively ignored. * be actively ignored.
*/ */
if ((*flags & OF_GPIO_ACTIVE_LOW) && !active_low) { of_gpio_quirk_polarity(np, active_high, flags);
pr_warn("%s GPIO handle specifies active low - ignored\n",
of_node_full_name(np));
*flags &= ~OF_GPIO_ACTIVE_LOW;
}
if (active_low)
*flags |= OF_GPIO_ACTIVE_LOW;
} }
/* /*
* Legacy open drain handling for fixed voltage regulators. * Legacy open drain handling for fixed voltage regulators.
...@@ -200,18 +216,10 @@ static void of_gpio_flags_quirks(const struct device_node *np, ...@@ -200,18 +216,10 @@ static void of_gpio_flags_quirks(const struct device_node *np,
* conflict and the "spi-cs-high" flag will * conflict and the "spi-cs-high" flag will
* take precedence. * take precedence.
*/ */
if (of_property_read_bool(child, "spi-cs-high")) { bool active_high = of_property_read_bool(child,
if (*flags & OF_GPIO_ACTIVE_LOW) { "spi-cs-high");
pr_warn("%s GPIO handle specifies active low - ignored\n", of_gpio_quirk_polarity(child, active_high,
of_node_full_name(child)); flags);
*flags &= ~OF_GPIO_ACTIVE_LOW;
}
} else {
if (!(*flags & OF_GPIO_ACTIVE_LOW))
pr_info("%s enforce active low on chipselect handle\n",
of_node_full_name(child));
*flags |= OF_GPIO_ACTIVE_LOW;
}
of_node_put(child); of_node_put(child);
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment