summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/gpio/gpiolib-of.c49
1 files changed, 16 insertions, 33 deletions
diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c
index fa8044228f0e..a6e1891217e2 100644
--- a/drivers/gpio/gpiolib-of.c
+++ b/drivers/gpio/gpiolib-of.c
@@ -54,6 +54,7 @@ static struct gpio_desc *of_xlate_and_get_gpiod_flags(struct gpio_chip *chip,
}
static void of_gpio_flags_quirks(struct device_node *np,
+ const char *propname,
enum of_gpio_flags *flags,
int index)
{
@@ -61,39 +62,21 @@ static void of_gpio_flags_quirks(struct device_node *np,
* Handle MMC "cd-inverted" and "wp-inverted" semantics.
*/
if (IS_ENABLED(CONFIG_MMC)) {
- if (of_property_read_bool(np, "cd-gpios")) {
- if (of_property_read_bool(np, "cd-inverted")) {
- if (*flags & OF_GPIO_ACTIVE_LOW) {
- /* "cd-inverted" takes precedence */
- *flags &= ~OF_GPIO_ACTIVE_LOW;
- pr_warn("%s GPIO handle specifies CD active low - ignored\n",
- of_node_full_name(np));
- }
- } else {
- /*
- * Active low is the default according to the
- * SDHCI specification. If the GPIO handle
- * specifies the same thing - good.
- */
- *flags |= OF_GPIO_ACTIVE_LOW;
- }
+ /*
+ * Active low is the default according to the
+ * SDHCI specification and the device tree
+ * bindings. However the code in the current
+ * kernel was written such that the phandle
+ * flags were always respected, and "cd-inverted"
+ * would invert the flag from the device phandle.
+ */
+ if (!strcmp(propname, "cd-gpios")) {
+ if (of_property_read_bool(np, "cd-inverted"))
+ *flags ^= OF_GPIO_ACTIVE_LOW;
}
- if (of_property_read_bool(np, "wp-gpios")) {
- if (of_property_read_bool(np, "wp-inverted")) {
- /* "wp-inverted" takes precedence */
- if (*flags & OF_GPIO_ACTIVE_LOW) {
- *flags &= ~OF_GPIO_ACTIVE_LOW;
- pr_warn("%s GPIO handle specifies WP active low - ignored\n",
- of_node_full_name(np));
- }
- } else {
- /*
- * Active low is the default according to the
- * SDHCI specification. If the GPIO handle
- * specifies the same thing - good.
- */
- *flags |= OF_GPIO_ACTIVE_LOW;
- }
+ if (!strcmp(propname, "wp-gpios")) {
+ if (of_property_read_bool(np, "wp-inverted"))
+ *flags ^= OF_GPIO_ACTIVE_LOW;
}
}
/*
@@ -213,7 +196,7 @@ struct gpio_desc *of_get_named_gpiod_flags(struct device_node *np,
goto out;
if (flags)
- of_gpio_flags_quirks(np, flags, index);
+ of_gpio_flags_quirks(np, propname, flags, index);
pr_debug("%s: parsed '%s' property of node '%pOF[%d]' - status (%d)\n",
__func__, propname, np, index,