Merge tag 'spi-fix-v5.14-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/brooni...
[linux-2.6-microblaze.git] / drivers / nvmem / core.c
index 62d363a..b3bc30a 100644 (file)
@@ -180,6 +180,7 @@ static const char * const nvmem_type_str[] = {
        [NVMEM_TYPE_EEPROM] = "EEPROM",
        [NVMEM_TYPE_OTP] = "OTP",
        [NVMEM_TYPE_BATTERY_BACKED] = "Battery backed",
+       [NVMEM_TYPE_FRAM] = "FRAM",
 };
 
 #ifdef CONFIG_DEBUG_LOCK_ALLOC
@@ -359,6 +360,9 @@ static int nvmem_sysfs_setup_compat(struct nvmem_device *nvmem,
        if (!config->base_dev)
                return -EINVAL;
 
+       if (config->type == NVMEM_TYPE_FRAM)
+               bin_attr_nvmem_eeprom_compat.attr.name = "fram";
+
        nvmem->eeprom = bin_attr_nvmem_eeprom_compat;
        nvmem->eeprom.attr.mode = nvmem_bin_attr_get_umode(nvmem);
        nvmem->eeprom.size = nvmem->size;
@@ -686,15 +690,17 @@ static int nvmem_add_cells_from_of(struct nvmem_device *nvmem)
                        continue;
                if (len < 2 * sizeof(u32)) {
                        dev_err(dev, "nvmem: invalid reg on %pOF\n", child);
+                       of_node_put(child);
                        return -EINVAL;
                }
 
                cell = kzalloc(sizeof(*cell), GFP_KERNEL);
-               if (!cell)
+               if (!cell) {
+                       of_node_put(child);
                        return -ENOMEM;
+               }
 
                cell->nvmem = nvmem;
-               cell->np = of_node_get(child);
                cell->offset = be32_to_cpup(addr++);
                cell->bytes = be32_to_cpup(addr);
                cell->name = kasprintf(GFP_KERNEL, "%pOFn", child);
@@ -715,11 +721,12 @@ static int nvmem_add_cells_from_of(struct nvmem_device *nvmem)
                                cell->name, nvmem->stride);
                        /* Cells already added will be freed later. */
                        kfree_const(cell->name);
-                       of_node_put(cell->np);
                        kfree(cell);
+                       of_node_put(child);
                        return -EINVAL;
                }
 
+               cell->np = of_node_get(child);
                nvmem_cell_add(cell);
        }
 
@@ -1608,9 +1615,9 @@ int nvmem_cell_read_u64(struct device *dev, const char *cell_id, u64 *val)
 }
 EXPORT_SYMBOL_GPL(nvmem_cell_read_u64);
 
-static void *nvmem_cell_read_variable_common(struct device *dev,
-                                            const char *cell_id,
-                                            size_t max_len, size_t *len)
+static const void *nvmem_cell_read_variable_common(struct device *dev,
+                                                  const char *cell_id,
+                                                  size_t max_len, size_t *len)
 {
        struct nvmem_cell *cell;
        int nbits;
@@ -1654,7 +1661,7 @@ int nvmem_cell_read_variable_le_u32(struct device *dev, const char *cell_id,
                                    u32 *val)
 {
        size_t len;
-       u8 *buf;
+       const u8 *buf;
        int i;
 
        buf = nvmem_cell_read_variable_common(dev, cell_id, sizeof(*val), &len);
@@ -1685,7 +1692,7 @@ int nvmem_cell_read_variable_le_u64(struct device *dev, const char *cell_id,
                                    u64 *val)
 {
        size_t len;
-       u8 *buf;
+       const u8 *buf;
        int i;
 
        buf = nvmem_cell_read_variable_common(dev, cell_id, sizeof(*val), &len);