[PATCH v2] nvmem: Change to unified property interface

2021-03-29 Thread Kevin Paul Herbert
Change from using device tree (Open Firmware) APIs to the unified
'fwnode' interface.

Change of_nvmem_cell_get() to fwnode_nvmem_cell_get(), and add a
wrapper for of_nvmem_cell_get().

Change of_nvmem_device_get() to fwnode_nvmem_device_get(). There
are no known accessors to the OF interface, so no need for a wrapper.

The first version of this patch incorrectly had a wrapper for
of_nvmem_device_get(), even though the comments about the patch
not needing this were correct.

Reported-by: kernel test robot 

Signed-off-by: Kevin Paul Herbert 
---
 drivers/nvmem/core.c   | 176 -
 include/linux/nvmem-consumer.h |  31 +++---
 2 files changed, 125 insertions(+), 82 deletions(-)

diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c
index a5ab1e0c74cf..2e49304cd9a8 100644
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -6,6 +6,7 @@
  * Copyright (C) 2013 Maxime Ripard 
  */
 
+#include 
 #include 
 #include 
 #include 
@@ -17,6 +18,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 
 struct nvmem_device {
@@ -52,7 +54,7 @@ struct nvmem_cell {
int bytes;
int bit_offset;
int nbits;
-   struct device_node  *np;
+   struct fwnode_handle*fwnode;
struct nvmem_device *nvmem;
struct list_headnode;
 };
@@ -424,7 +426,7 @@ static void nvmem_cell_drop(struct nvmem_cell *cell)
mutex_lock(_mutex);
list_del(>node);
mutex_unlock(_mutex);
-   of_node_put(cell->np);
+   fwnode_handle_put(cell->fwnode);
kfree_const(cell->name);
kfree(cell);
 }
@@ -670,39 +672,40 @@ static int nvmem_validate_keepouts(struct nvmem_device 
*nvmem)
return 0;
 }
 
-static int nvmem_add_cells_from_of(struct nvmem_device *nvmem)
+static int nvmem_add_cells_from_fw(struct nvmem_device *nvmem)
 {
-   struct device_node *parent, *child;
+   struct fwnode_handle *parent, *child;
struct device *dev = >dev;
struct nvmem_cell *cell;
-   const __be32 *addr;
-   int len;
+   int rval;
+   u32 vals[2];
 
-   parent = dev->of_node;
+   parent = dev_fwnode(dev);
 
-   for_each_child_of_node(parent, child) {
-   addr = of_get_property(child, "reg", );
-   if (!addr)
+   fwnode_for_each_child_node(parent, child) {
+   rval = fwnode_property_read_u32_array(child, "reg", NULL, 2);
+   if (rval < 0)
continue;
-   if (len < 2 * sizeof(u32)) {
-   dev_err(dev, "nvmem: invalid reg on %pOF\n", child);
+   if (rval < 2) {
+   dev_err(dev, "nvmem: invalid reg %d on %pfw\n",
+   rval, child);
return -EINVAL;
}
-
+   rval = fwnode_property_read_u32_array(child, "reg", vals, 2);
cell = kzalloc(sizeof(*cell), GFP_KERNEL);
if (!cell)
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);
-
-   addr = of_get_property(child, "bits", );
-   if (addr && len == (2 * sizeof(u32))) {
-   cell->bit_offset = be32_to_cpup(addr++);
-   cell->nbits = be32_to_cpup(addr);
+   cell->fwnode = child;
+   cell->offset = vals[0];
+   cell->bytes = vals[1];
+   cell->name = kasprintf(GFP_KERNEL, "%pfwn", child);
+
+   rval = fwnode_property_read_u32_array(child, "bits", vals, 2);
+   if (rval >= 0) {
+   cell->bit_offset = vals[0];
+   cell->nbits = vals[1];
}
 
if (cell->nbits)
@@ -715,7 +718,7 @@ 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);
+   fwnode_handle_put(cell->fwnode);
kfree(cell);
return -EINVAL;
}
@@ -789,8 +792,10 @@ struct nvmem_device *nvmem_register(const struct 
nvmem_config *config)
nvmem->reg_write = config->reg_write;
nvmem->keepout = config->keepout;
nvmem->nkeepout = config->nkeepout;
-   if (!config->no_of_node)
+   if (!config->no_of_node) {
nvmem->dev.of_node = config->dev->of_node;
+   nvmem->dev.fwnode = config->dev->fwnode;
+   }
 
switch (config->id) {
case NVMEM_DEVID_NONE:
@@ -841,7 

[PATCH v2] nvmem: Change to unified property interface

2021-03-29 Thread Kevin Paul Herbert


The original version of this patch correctly stated that the only
wrapper needed was for of_nvmem_cell_get(), but included only a wrapper
for of_nvmem_device_get(). Replace with the proper wrapper.



[PATCH v2] nvmem: Change to unified property interface

2021-03-29 Thread Kevin Paul Herbert


THis first version of this patch erroneously had an unnecessary wrapper
for of_nvmem_device_get() even though the commentary properly stated
that the only wrapper needed was of_nvmem_cell_get(). Fix the code to
match the intent.