}
static void of_gpio_flags_quirks(struct device_node *np,
+ const char *propname,
enum of_gpio_flags *flags,
int index)
{
* 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;
}
}
/*
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,