clk: imx: imx8mq: use imx8m_clk_hw_composite_core
[linux-2.6-microblaze.git] / drivers / nvmem / core.c
index 1e4a798..ef326f2 100644 (file)
@@ -15,6 +15,7 @@
 #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"
@@ -54,8 +55,14 @@ static int nvmem_reg_read(struct nvmem_device *nvmem, unsigned int offset,
 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;
 }
@@ -340,6 +347,14 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config)
                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 ERR_CAST(nvmem->wp_gpio);
+
 
        kref_init(&nvmem->refcnt);
        INIT_LIST_HEAD(&nvmem->cells);