*flags |= GPIO_OPEN_SOURCE;
        }
 
-       if (of_flags & OF_GPIO_SLEEP_MAY_LOSE_VALUE)
-               *flags |= GPIO_SLEEP_MAY_LOSE_VALUE;
+       if (of_flags & OF_GPIO_TRANSITORY)
+               *flags |= GPIO_TRANSITORY;
 
        return desc;
 }
 
        if (xlate_flags & OF_GPIO_ACTIVE_LOW)
                *lflags |= GPIO_ACTIVE_LOW;
+       if (xlate_flags & OF_GPIO_TRANSITORY)
+               *lflags |= GPIO_TRANSITORY;
 
        if (of_property_read_bool(np, "input"))
                *dflags |= GPIOD_IN;
 
                        status = -ENODEV;
                goto done;
        }
-       status = gpiod_export(desc, true);
-       if (status < 0)
-               gpiod_free(desc);
-       else
-               set_bit(FLAG_SYSFS, &desc->flags);
+
+       status = gpiod_set_transitory(desc, false);
+       if (!status) {
+               status = gpiod_export(desc, true);
+               if (status < 0)
+                       gpiod_free(desc);
+               else
+                       set_bit(FLAG_SYSFS, &desc->flags);
+       }
 
 done:
        if (status)
 
                if (lflags & GPIOHANDLE_REQUEST_OPEN_SOURCE)
                        set_bit(FLAG_OPEN_SOURCE, &desc->flags);
 
+               ret = gpiod_set_transitory(desc, false);
+               if (ret < 0)
+                       goto out_free_descs;
+
                /*
                 * Lines have to be requested explicitly for input
                 * or output, else the line will be treated "as is".
 }
 EXPORT_SYMBOL_GPL(gpiod_set_debounce);
 
+/**
+ * gpiod_set_transitory - Lose or retain GPIO state on suspend or reset
+ * @desc: descriptor of the GPIO for which to configure persistence
+ * @transitory: True to lose state on suspend or reset, false for persistence
+ *
+ * Returns:
+ * 0 on success, otherwise a negative error code.
+ */
+int gpiod_set_transitory(struct gpio_desc *desc, bool transitory)
+{
+       struct gpio_chip *chip;
+       unsigned long packed;
+       int gpio;
+       int rc;
+
+       /*
+        * Handle FLAG_TRANSITORY first, enabling queries to gpiolib for
+        * persistence state.
+        */
+       if (transitory)
+               set_bit(FLAG_TRANSITORY, &desc->flags);
+       else
+               clear_bit(FLAG_TRANSITORY, &desc->flags);
+
+       /* If the driver supports it, set the persistence state now */
+       chip = desc->gdev->chip;
+       if (!chip->set_config)
+               return 0;
+
+       packed = pinconf_to_config_packed(PIN_CONFIG_PERSIST_STATE,
+                                         !transitory);
+       gpio = gpio_chip_hwgpio(desc);
+       rc = chip->set_config(chip, gpio, packed);
+       if (rc == -ENOTSUPP) {
+               dev_dbg(&desc->gdev->dev, "Persistence not supported for GPIO %d\n",
+                               gpio);
+               return 0;
+       }
+
+       return rc;
+}
+EXPORT_SYMBOL_GPL(gpiod_set_transitory);
+
 /**
  * gpiod_is_active_low - test whether a GPIO is active-low or not
  * @desc: the gpio descriptor to test
        if (offset >= chip->ngpio)
                return false;
 
-       return !test_bit(FLAG_SLEEP_MAY_LOSE_VALUE,
-                        &chip->gpiodev->descs[offset].flags);
+       return !test_bit(FLAG_TRANSITORY, &chip->gpiodev->descs[offset].flags);
 }
 EXPORT_SYMBOL_GPL(gpiochip_line_is_persistent);
 
 
        if (lflags & GPIO_OPEN_SOURCE)
                set_bit(FLAG_OPEN_SOURCE, &desc->flags);
-       if (lflags & GPIO_SLEEP_MAY_LOSE_VALUE)
-               set_bit(FLAG_SLEEP_MAY_LOSE_VALUE, &desc->flags);
+
+       status = gpiod_set_transitory(desc, (lflags & GPIO_TRANSITORY));
+       if (status < 0)
+               return status;
 
        /* No particular flag request, return here... */
        if (!(dflags & GPIOD_FLAGS_BIT_DIR_SET)) {
        bool active_low = false;
        bool single_ended = false;
        bool open_drain = false;
+       bool transitory = false;
        int ret;
 
        if (!fwnode)
                        active_low = flags & OF_GPIO_ACTIVE_LOW;
                        single_ended = flags & OF_GPIO_SINGLE_ENDED;
                        open_drain = flags & OF_GPIO_OPEN_DRAIN;
+                       transitory = flags & OF_GPIO_TRANSITORY;
                }
        } else if (is_acpi_node(fwnode)) {
                struct acpi_gpio_info info;
                        lflags |= GPIO_OPEN_SOURCE;
        }
 
+       if (transitory)
+               lflags |= GPIO_TRANSITORY;
+
        ret = gpiod_configure_flags(desc, propname, lflags, dflags);
        if (ret < 0) {
                gpiod_put(desc);
 
 #define FLAG_OPEN_SOURCE 8     /* Gpio is open source type */
 #define FLAG_USED_AS_IRQ 9     /* GPIO is connected to an IRQ */
 #define FLAG_IS_HOGGED 11      /* GPIO is hogged */
-#define FLAG_SLEEP_MAY_LOSE_VALUE 12   /* GPIO may lose value in sleep */
+#define FLAG_TRANSITORY 12     /* GPIO may lose value in sleep or reset */
 
        /* Connection label */
        const char              *label;
 
 #define GPIO_OPEN_DRAIN (GPIO_SINGLE_ENDED | GPIO_LINE_OPEN_DRAIN)
 #define GPIO_OPEN_SOURCE (GPIO_SINGLE_ENDED | GPIO_LINE_OPEN_SOURCE)
 
-/* Bit 3 express GPIO suspend/resume persistence */
-#define GPIO_SLEEP_MAINTAIN_VALUE 0
-#define GPIO_SLEEP_MAY_LOSE_VALUE 8
+/* Bit 3 express GPIO suspend/resume and reset persistence */
+#define GPIO_PERSISTENT 0
+#define GPIO_TRANSITORY 8
 
 #endif
 
                                        int *value_array);
 
 int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce);
+int gpiod_set_transitory(struct gpio_desc *desc, bool transitory);
 
 int gpiod_is_active_low(const struct gpio_desc *desc);
 int gpiod_cansleep(const struct gpio_desc *desc);
        return -ENOSYS;
 }
 
+static inline int gpiod_set_transitory(struct gpio_desc *desc, bool transitory)
+{
+       /* GPIO can never have been requested */
+       WARN_ON(1);
+       return -ENOSYS;
+}
+
 static inline int gpiod_is_active_low(const struct gpio_desc *desc)
 {
        /* GPIO can never have been requested */
 
        GPIO_ACTIVE_LOW = (1 << 0),
        GPIO_OPEN_DRAIN = (1 << 1),
        GPIO_OPEN_SOURCE = (1 << 2),
-       GPIO_SLEEP_MAINTAIN_VALUE = (0 << 3),
-       GPIO_SLEEP_MAY_LOSE_VALUE = (1 << 3),
+       GPIO_PERSISTENT = (0 << 3),
+       GPIO_TRANSITORY = (1 << 3),
 };
 
 /**
 
        OF_GPIO_ACTIVE_LOW = 0x1,
        OF_GPIO_SINGLE_ENDED = 0x2,
        OF_GPIO_OPEN_DRAIN = 0x4,
-       OF_GPIO_SLEEP_MAY_LOSE_VALUE = 0x8,
+       OF_GPIO_TRANSITORY = 0x8,
 };
 
 #ifdef CONFIG_OF_GPIO
 
  *     or latch delay (on outputs) this parameter (in a custom format)
  *     specifies the clock skew or latch delay. It typically controls how
  *     many double inverters are put in front of the line.
+ * @PIN_CONFIG_PERSIST_STATE: retain pin state across sleep or controller reset
  * @PIN_CONFIG_END: this is the last enumerator for pin configurations, if
  *     you need to pass in custom configurations to the pin controller, use
  *     PIN_CONFIG_END+1 as the base offset.
        PIN_CONFIG_SLEEP_HARDWARE_STATE,
        PIN_CONFIG_SLEW_RATE,
        PIN_CONFIG_SKEW_DELAY,
+       PIN_CONFIG_PERSIST_STATE,
        PIN_CONFIG_END = 0x7F,
        PIN_CONFIG_MAX = 0xFF,
 };