#include <linux/module.h>
 #include <linux/nvmem-consumer.h>
 #include <linux/nvmem-provider.h>
+#include <linux/gpio/consumer.h>
 #include <linux/of.h>
 #include <linux/slab.h>
 #include "nvmem.h"
 static int nvmem_reg_write(struct nvmem_device *nvmem, unsigned int offset,
                           void *val, size_t bytes)
 {
-       if (nvmem->reg_write)
-               return nvmem->reg_write(nvmem->priv, offset, val, bytes);
+       int ret;
+
+       if (nvmem->reg_write) {
+               gpiod_set_value_cansleep(nvmem->wp_gpio, 0);
+               ret = nvmem->reg_write(nvmem->priv, offset, val, bytes);
+               gpiod_set_value_cansleep(nvmem->wp_gpio, 1);
+               return ret;
+       }
 
        return -EINVAL;
 }
                kfree(nvmem);
                return ERR_PTR(rval);
        }
+       if (config->wp_gpio)
+               nvmem->wp_gpio = config->wp_gpio;
+       else
+               nvmem->wp_gpio = gpiod_get_optional(config->dev, "wp",
+                                                   GPIOD_OUT_HIGH);
+       if (IS_ERR(nvmem->wp_gpio))
+               return PTR_ERR(nvmem->wp_gpio);
+
 
        kref_init(&nvmem->refcnt);
        INIT_LIST_HEAD(&nvmem->cells);
 
 #include <linux/list.h>
 #include <linux/nvmem-consumer.h>
 #include <linux/nvmem-provider.h>
+#include <linux/gpio/consumer.h>
 
 struct nvmem_device {
        struct module           *owner;
        struct list_head        cells;
        nvmem_reg_read_t        reg_read;
        nvmem_reg_write_t       reg_write;
+       struct gpio_desc        *wp_gpio;
        void *priv;
 };
 
 
 
 #include <linux/err.h>
 #include <linux/errno.h>
+#include <linux/gpio/consumer.h>
 
 struct nvmem_device;
 struct nvmem_cell_info;
  * @word_size: Minimum read/write access granularity.
  * @stride:    Minimum read/write access stride.
  * @priv:      User context passed to read/write callbacks.
+ * @wp-gpio:   Write protect pin
  *
  * Note: A default "nvmem<id>" name will be assigned to the device if
  * no name is specified in its configuration. In such case "<id>" is
        const char              *name;
        int                     id;
        struct module           *owner;
+       struct gpio_desc        *wp_gpio;
        const struct nvmem_cell_info    *cells;
        int                     ncells;
        enum nvmem_type         type;