gpio/mmc/of: Respect polarity in the device tree
The device tree bindings for the MMC card detect and
write protect lines specify that these should be active
low unless "cd-inverted" or "wp-inverted" has been
specified.
However that is not how the kernel code has worked. It
has always respected the flags passed to the phandle in
the device tree, but respected the "cd-inverted" and
"wp-inverted" flags such that if those are set, the
polarity will be the inverse of that specified in the
device tree.
Switch to behaving like the old code did and fix the
regression.
Fixes: 81c85ec15a
("gpio: OF: Parse MMC-specific CD and WP properties")
Cc: Bartosz Golaszewski <bgolaszewski@baylibre.com>
Cc: Guenter Roeck <linux@roeck-us.net>
Reported-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
12d6dd0698
commit
89a5e15bcb
@ -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,
|
static void of_gpio_flags_quirks(struct device_node *np,
|
||||||
|
const char *propname,
|
||||||
enum of_gpio_flags *flags,
|
enum of_gpio_flags *flags,
|
||||||
int index)
|
int index)
|
||||||
{
|
{
|
||||||
@ -61,39 +62,21 @@ static void of_gpio_flags_quirks(struct device_node *np,
|
|||||||
* Handle MMC "cd-inverted" and "wp-inverted" semantics.
|
* Handle MMC "cd-inverted" and "wp-inverted" semantics.
|
||||||
*/
|
*/
|
||||||
if (IS_ENABLED(CONFIG_MMC)) {
|
if (IS_ENABLED(CONFIG_MMC)) {
|
||||||
if (of_property_read_bool(np, "cd-gpios")) {
|
/*
|
||||||
if (of_property_read_bool(np, "cd-inverted")) {
|
* Active low is the default according to the
|
||||||
if (*flags & OF_GPIO_ACTIVE_LOW) {
|
* SDHCI specification and the device tree
|
||||||
/* "cd-inverted" takes precedence */
|
* bindings. However the code in the current
|
||||||
*flags &= ~OF_GPIO_ACTIVE_LOW;
|
* kernel was written such that the phandle
|
||||||
pr_warn("%s GPIO handle specifies CD active low - ignored\n",
|
* flags were always respected, and "cd-inverted"
|
||||||
of_node_full_name(np));
|
* would invert the flag from the device phandle.
|
||||||
}
|
*/
|
||||||
} else {
|
if (!strcmp(propname, "cd-gpios")) {
|
||||||
/*
|
if (of_property_read_bool(np, "cd-inverted"))
|
||||||
* Active low is the default according to the
|
*flags ^= OF_GPIO_ACTIVE_LOW;
|
||||||
* SDHCI specification. If the GPIO handle
|
|
||||||
* specifies the same thing - good.
|
|
||||||
*/
|
|
||||||
*flags |= OF_GPIO_ACTIVE_LOW;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (of_property_read_bool(np, "wp-gpios")) {
|
if (!strcmp(propname, "wp-gpios")) {
|
||||||
if (of_property_read_bool(np, "wp-inverted")) {
|
if (of_property_read_bool(np, "wp-inverted"))
|
||||||
/* "wp-inverted" takes precedence */
|
*flags ^= OF_GPIO_ACTIVE_LOW;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
@ -213,7 +196,7 @@ struct gpio_desc *of_get_named_gpiod_flags(struct device_node *np,
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (flags)
|
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",
|
pr_debug("%s: parsed '%s' property of node '%pOF[%d]' - status (%d)\n",
|
||||||
__func__, propname, np, index,
|
__func__, propname, np, index,
|
||||||
|
Loading…
Reference in New Issue
Block a user