diff options
Diffstat (limited to 'drivers/nvmem/core.c')
-rw-r--r-- | drivers/nvmem/core.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c index 9b18ce90f907..27f67dfa649d 100644 --- a/drivers/nvmem/core.c +++ b/drivers/nvmem/core.c | |||
@@ -44,6 +44,7 @@ struct nvmem_cell { | |||
44 | int bytes; | 44 | int bytes; |
45 | int bit_offset; | 45 | int bit_offset; |
46 | int nbits; | 46 | int nbits; |
47 | struct device_node *np; | ||
47 | struct nvmem_device *nvmem; | 48 | struct nvmem_device *nvmem; |
48 | struct list_head node; | 49 | struct list_head node; |
49 | }; | 50 | }; |
@@ -298,6 +299,7 @@ static void nvmem_cell_drop(struct nvmem_cell *cell) | |||
298 | mutex_lock(&nvmem_mutex); | 299 | mutex_lock(&nvmem_mutex); |
299 | list_del(&cell->node); | 300 | list_del(&cell->node); |
300 | mutex_unlock(&nvmem_mutex); | 301 | mutex_unlock(&nvmem_mutex); |
302 | of_node_put(cell->np); | ||
301 | kfree(cell->name); | 303 | kfree(cell->name); |
302 | kfree(cell); | 304 | kfree(cell); |
303 | } | 305 | } |
@@ -530,6 +532,7 @@ static int nvmem_add_cells_from_of(struct nvmem_device *nvmem) | |||
530 | return -ENOMEM; | 532 | return -ENOMEM; |
531 | 533 | ||
532 | cell->nvmem = nvmem; | 534 | cell->nvmem = nvmem; |
535 | cell->np = of_node_get(child); | ||
533 | cell->offset = be32_to_cpup(addr++); | 536 | cell->offset = be32_to_cpup(addr++); |
534 | cell->bytes = be32_to_cpup(addr); | 537 | cell->bytes = be32_to_cpup(addr); |
535 | cell->name = kasprintf(GFP_KERNEL, "%pOFn", child); | 538 | cell->name = kasprintf(GFP_KERNEL, "%pOFn", child); |
@@ -960,14 +963,13 @@ out: | |||
960 | 963 | ||
961 | #if IS_ENABLED(CONFIG_OF) | 964 | #if IS_ENABLED(CONFIG_OF) |
962 | static struct nvmem_cell * | 965 | static struct nvmem_cell * |
963 | nvmem_find_cell_by_index(struct nvmem_device *nvmem, int index) | 966 | nvmem_find_cell_by_node(struct nvmem_device *nvmem, struct device_node *np) |
964 | { | 967 | { |
965 | struct nvmem_cell *cell = NULL; | 968 | struct nvmem_cell *cell = NULL; |
966 | int i = 0; | ||
967 | 969 | ||
968 | mutex_lock(&nvmem_mutex); | 970 | mutex_lock(&nvmem_mutex); |
969 | list_for_each_entry(cell, &nvmem->cells, node) { | 971 | list_for_each_entry(cell, &nvmem->cells, node) { |
970 | if (index == i++) | 972 | if (np == cell->np) |
971 | break; | 973 | break; |
972 | } | 974 | } |
973 | mutex_unlock(&nvmem_mutex); | 975 | mutex_unlock(&nvmem_mutex); |
@@ -1011,7 +1013,7 @@ struct nvmem_cell *of_nvmem_cell_get(struct device_node *np, const char *id) | |||
1011 | if (IS_ERR(nvmem)) | 1013 | if (IS_ERR(nvmem)) |
1012 | return ERR_CAST(nvmem); | 1014 | return ERR_CAST(nvmem); |
1013 | 1015 | ||
1014 | cell = nvmem_find_cell_by_index(nvmem, index); | 1016 | cell = nvmem_find_cell_by_node(nvmem, cell_np); |
1015 | if (!cell) { | 1017 | if (!cell) { |
1016 | __nvmem_device_put(nvmem); | 1018 | __nvmem_device_put(nvmem); |
1017 | return ERR_PTR(-ENOENT); | 1019 | return ERR_PTR(-ENOENT); |