devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] nvmem: add DT overlay support for cells
@ 2020-10-14 21:41 Michael Auchter
  2020-10-14 21:41 ` [PATCH 1/2] nvmem: core: extract function to add cell from OF Michael Auchter
  2020-10-14 21:41 ` [PATCH 2/2] nvmem: core: add OF_RECONFIG handler for nvmem cells Michael Auchter
  0 siblings, 2 replies; 6+ messages in thread
From: Michael Auchter @ 2020-10-14 21:41 UTC (permalink / raw)
  To: srinivas.kandagatla, pantelis.antoniou, frowand.list
  Cc: devicetree, linux-kernel, Michael Auchter

This patchset adds the ability to add/remove nvmem cells to an nvmem
device using device tree overlays. This can be useful in situations
where an nvmem device is present in the base device tree and the
specific overlay that's loaded knows how to interpret the data within
the nvmem device.

Michael Auchter (2):
  nvmem: core: extract function to add cell from OF
  nvmem: core: add OF_RECONFIG handler for nvmem cells

 drivers/nvmem/core.c | 149 ++++++++++++++++++++++++++++++++-----------
 1 file changed, 110 insertions(+), 39 deletions(-)

-- 
2.25.4


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/2] nvmem: core: extract function to add cell from OF
  2020-10-14 21:41 [PATCH 0/2] nvmem: add DT overlay support for cells Michael Auchter
@ 2020-10-14 21:41 ` Michael Auchter
  2020-10-14 21:41 ` [PATCH 2/2] nvmem: core: add OF_RECONFIG handler for nvmem cells Michael Auchter
  1 sibling, 0 replies; 6+ messages in thread
From: Michael Auchter @ 2020-10-14 21:41 UTC (permalink / raw)
  To: srinivas.kandagatla, pantelis.antoniou, frowand.list
  Cc: devicetree, linux-kernel, Michael Auchter

Extract the logic needed to add a single cell described by a device tree
node from nvmem_add_cells_from_of, and call this new function for each
child node.

Signed-off-by: Michael Auchter <michael.auchter@ni.com>
---
 drivers/nvmem/core.c | 84 +++++++++++++++++++++++++-------------------
 1 file changed, 48 insertions(+), 36 deletions(-)

diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c
index 6cd3edb2eaf6..91979529cb07 100644
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -518,54 +518,66 @@ nvmem_find_cell_by_name(struct nvmem_device *nvmem, const char *cell_id)
 	return cell;
 }
 
-static int nvmem_add_cells_from_of(struct nvmem_device *nvmem)
+static int nvmem_add_cell_from_of(struct nvmem_device *nvmem,
+				  struct device_node *child)
 {
-	struct device_node *parent, *child;
 	struct device *dev = &nvmem->dev;
 	struct nvmem_cell *cell;
 	const __be32 *addr;
 	int len;
 
-	parent = dev->of_node;
+	addr = of_get_property(child, "reg", &len);
+	if (!addr || (len < 2 * sizeof(u32))) {
+		dev_err(dev, "nvmem: invalid reg on %pOF\n", child);
+		return -EINVAL;
+	}
 
-	for_each_child_of_node(parent, child) {
-		addr = of_get_property(child, "reg", &len);
-		if (!addr || (len < 2 * sizeof(u32))) {
-			dev_err(dev, "nvmem: invalid reg on %pOF\n", child);
-			return -EINVAL;
-		}
+	cell = kzalloc(sizeof(*cell), GFP_KERNEL);
+	if (!cell)
+		return -ENOMEM;
 
-		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", &len);
+	if (addr && len == (2 * sizeof(u32))) {
+		cell->bit_offset = be32_to_cpup(addr++);
+		cell->nbits = be32_to_cpup(addr);
+	}
 
-		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);
+	if (cell->nbits)
+		cell->bytes = DIV_ROUND_UP(
+				cell->nbits + cell->bit_offset,
+				BITS_PER_BYTE);
 
-		addr = of_get_property(child, "bits", &len);
-		if (addr && len == (2 * sizeof(u32))) {
-			cell->bit_offset = be32_to_cpup(addr++);
-			cell->nbits = be32_to_cpup(addr);
-		}
+	if (!IS_ALIGNED(cell->offset, nvmem->stride)) {
+		dev_err(dev, "cell %s unaligned to nvmem stride %d\n",
+			cell->name, nvmem->stride);
+		/* Cells already added will be freed later. */
+		kfree_const(cell->name);
+		kfree(cell);
+		return -EINVAL;
+	}
 
-		if (cell->nbits)
-			cell->bytes = DIV_ROUND_UP(
-					cell->nbits + cell->bit_offset,
-					BITS_PER_BYTE);
-
-		if (!IS_ALIGNED(cell->offset, nvmem->stride)) {
-			dev_err(dev, "cell %s unaligned to nvmem stride %d\n",
-				cell->name, nvmem->stride);
-			/* Cells already added will be freed later. */
-			kfree_const(cell->name);
-			kfree(cell);
-			return -EINVAL;
-		}
+	nvmem_cell_add(cell);
 
-		nvmem_cell_add(cell);
+	return 0;
+}
+
+static int nvmem_add_cells_from_of(struct nvmem_device *nvmem)
+{
+	struct device_node *parent, *child;
+	int rval;
+
+	parent = nvmem->dev.of_node;
+
+	for_each_child_of_node(parent, child) {
+		rval = nvmem_add_cell_from_of(nvmem, child);
+		if (rval)
+			return rval;
 	}
 
 	return 0;
-- 
2.25.4


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/2] nvmem: core: add OF_RECONFIG handler for nvmem cells
  2020-10-14 21:41 [PATCH 0/2] nvmem: add DT overlay support for cells Michael Auchter
  2020-10-14 21:41 ` [PATCH 1/2] nvmem: core: extract function to add cell from OF Michael Auchter
@ 2020-10-14 21:41 ` Michael Auchter
  2020-10-15  0:13   ` kernel test robot
                     ` (2 more replies)
  1 sibling, 3 replies; 6+ messages in thread
From: Michael Auchter @ 2020-10-14 21:41 UTC (permalink / raw)
  To: srinivas.kandagatla, pantelis.antoniou, frowand.list
  Cc: devicetree, linux-kernel, Michael Auchter

CONFIG_OF_DYNAMIC allows runtime changes to the device tree. This patch
adds a OF_RECONFIG handler to receive notifications on tree changes to
support adding/removing cells from an nvmem device based on these
changes.

Signed-off-by: Michael Auchter <michael.auchter@ni.com>
---
 drivers/nvmem/core.c | 61 +++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 60 insertions(+), 1 deletion(-)

diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c
index 91979529cb07..859431c15d5b 100644
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -1629,6 +1629,53 @@ void nvmem_del_cell_lookups(struct nvmem_cell_lookup *entries, size_t nentries)
 }
 EXPORT_SYMBOL_GPL(nvmem_del_cell_lookups);
 
+#if IS_ENABLED(CONFIG_OF_DYNAMIC)
+static int of_nvmem_notify(struct notifier_block *nb, unsigned long action,
+			   void *arg)
+{
+
+	struct of_reconfig_data *rd = arg;
+	struct nvmem_device *nvmem;
+	struct nvmem_cell *cell;
+	int rval;
+
+	switch (of_reconfig_get_state_change(action, rd)) {
+	case OF_RECONFIG_CHANGE_ADD:
+		if (of_node_test_and_set_flag(rd->dn, OF_POPULATED))
+			return NOTIFY_OK;
+
+		nvmem = __nvmem_device_get(rd->dn->parent, device_match_of_node);
+		if (IS_ERR(nvmem))
+			return NOTIFY_OK;
+
+		rval = nvmem_add_cell_from_of(nvmem, rd->dn);
+		return notifier_from_errno(rval);
+		break;
+	case OF_RECONFIG_CHANGE_REMOVE:
+		if (!of_node_check_flag(rd->dn, OF_POPULATED))
+			return NOTIFY_OK;
+
+		nvmem = __nvmem_device_get(rd->dn->parent, device_match_of_node);
+		if (IS_ERR(nvmem))
+			return NOTIFY_OK;
+
+		cell = nvmem_find_cell_by_node(nvmem, rd->dn);
+		if (!cell)
+			return NOTIFY_OK;
+
+		nvmem_cell_drop(cell);
+		of_node_clear_flag(rd->dn, OF_POPULATED);
+		break;
+	}
+
+	return NOTIFY_OK;
+}
+
+struct notifier_block nvmem_of_notifier = {
+	.notifier_call = of_nvmem_notify,
+};
+#endif /* CONFIG_OF_DYNAMIC */
+
 /**
  * nvmem_dev_name() - Get the name of a given nvmem device.
  *
@@ -1644,11 +1691,23 @@ EXPORT_SYMBOL_GPL(nvmem_dev_name);
 
 static int __init nvmem_init(void)
 {
-	return bus_register(&nvmem_bus_type);
+	int rval;
+
+	rval = bus_register(&nvmem_bus_type);
+	if (rval)
+		return rval;
+
+	if (IS_ENABLED(CONFIG_OF_DYNAMIC))
+		WARN_ON(of_reconfig_notifier_register(&nvmem_of_notifier));
+
+	return 0;
 }
 
 static void __exit nvmem_exit(void)
 {
+	if (IS_ENABLED(CONFIG_OF_DYNAMIC))
+		WARN_ON(of_reconfig_notifier_unregister(&nvmem_of_notifier));
+
 	bus_unregister(&nvmem_bus_type);
 }
 
-- 
2.25.4


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] nvmem: core: add OF_RECONFIG handler for nvmem cells
  2020-10-14 21:41 ` [PATCH 2/2] nvmem: core: add OF_RECONFIG handler for nvmem cells Michael Auchter
@ 2020-10-15  0:13   ` kernel test robot
  2020-10-15  0:13   ` [RFC PATCH] nvmem: core: nvmem_of_notifier can be static kernel test robot
  2020-10-15  2:35   ` [PATCH 2/2] nvmem: core: add OF_RECONFIG handler for nvmem cells kernel test robot
  2 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2020-10-15  0:13 UTC (permalink / raw)
  To: Michael Auchter, srinivas.kandagatla, pantelis.antoniou,
	frowand.list
  Cc: kbuild-all, devicetree, linux-kernel, Michael Auchter

[-- Attachment #1: Type: text/plain, Size: 1674 bytes --]

Hi Michael,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on v5.9 next-20201013]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Michael-Auchter/nvmem-add-DT-overlay-support-for-cells/20201015-054223
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 37187df45af7d28d27b5c130c23f407ca9dbefa2
config: i386-randconfig-s001-20201014 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce:
        # apt-get install sparse
        # sparse version: v0.6.3-rc1-dirty
        # https://github.com/0day-ci/linux/commit/a3191767e8e4e0480e36126ce93e6ab41ab6f498
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Michael-Auchter/nvmem-add-DT-overlay-support-for-cells/20201015-054223
        git checkout a3191767e8e4e0480e36126ce93e6ab41ab6f498
        # save the attached .config to linux build tree
        make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=i386 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


"sparse warnings: (new ones prefixed by >>)"
>> drivers/nvmem/core.c:1674:23: sparse: sparse: symbol 'nvmem_of_notifier' was not declared. Should it be static?

Please review and possibly fold the followup patch.

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 36269 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [RFC PATCH] nvmem: core: nvmem_of_notifier can be static
  2020-10-14 21:41 ` [PATCH 2/2] nvmem: core: add OF_RECONFIG handler for nvmem cells Michael Auchter
  2020-10-15  0:13   ` kernel test robot
@ 2020-10-15  0:13   ` kernel test robot
  2020-10-15  2:35   ` [PATCH 2/2] nvmem: core: add OF_RECONFIG handler for nvmem cells kernel test robot
  2 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2020-10-15  0:13 UTC (permalink / raw)
  To: Michael Auchter, srinivas.kandagatla, pantelis.antoniou,
	frowand.list
  Cc: kbuild-all, devicetree, linux-kernel, Michael Auchter


Signed-off-by: kernel test robot <lkp@intel.com>
---
 core.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c
index 859431c15d5bc3..6dd79075fdd9b0 100644
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -1671,7 +1671,7 @@ static int of_nvmem_notify(struct notifier_block *nb, unsigned long action,
 	return NOTIFY_OK;
 }
 
-struct notifier_block nvmem_of_notifier = {
+static struct notifier_block nvmem_of_notifier = {
 	.notifier_call = of_nvmem_notify,
 };
 #endif /* CONFIG_OF_DYNAMIC */

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] nvmem: core: add OF_RECONFIG handler for nvmem cells
  2020-10-14 21:41 ` [PATCH 2/2] nvmem: core: add OF_RECONFIG handler for nvmem cells Michael Auchter
  2020-10-15  0:13   ` kernel test robot
  2020-10-15  0:13   ` [RFC PATCH] nvmem: core: nvmem_of_notifier can be static kernel test robot
@ 2020-10-15  2:35   ` kernel test robot
  2 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2020-10-15  2:35 UTC (permalink / raw)
  To: Michael Auchter, srinivas.kandagatla, pantelis.antoniou,
	frowand.list
  Cc: kbuild-all, clang-built-linux, devicetree, linux-kernel,
	Michael Auchter

[-- Attachment #1: Type: text/plain, Size: 3540 bytes --]

Hi Michael,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on linus/master]
[also build test ERROR on v5.9 next-20201013]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Michael-Auchter/nvmem-add-DT-overlay-support-for-cells/20201015-054223
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 37187df45af7d28d27b5c130c23f407ca9dbefa2
config: x86_64-randconfig-a006-20201014 (attached as .config)
compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project e7b4feea8e1bf520b34ad8c116abab6677344b74)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install x86_64 cross compiling tool for clang build
        # apt-get install binutils-x86-64-linux-gnu
        # https://github.com/0day-ci/linux/commit/a3191767e8e4e0480e36126ce93e6ab41ab6f498
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Michael-Auchter/nvmem-add-DT-overlay-support-for-cells/20201015-054223
        git checkout a3191767e8e4e0480e36126ce93e6ab41ab6f498
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

>> drivers/nvmem/core.c:1701:42: error: use of undeclared identifier 'nvmem_of_notifier'; did you mean 'nvmem_notifier'?
                   WARN_ON(of_reconfig_notifier_register(&nvmem_of_notifier));
                                                          ^~~~~~~~~~~~~~~~~
                                                          nvmem_notifier
   include/asm-generic/bug.h:119:25: note: expanded from macro 'WARN_ON'
           int __ret_warn_on = !!(condition);                              \
                                  ^
   drivers/nvmem/core.c:67:31: note: 'nvmem_notifier' declared here
   static BLOCKING_NOTIFIER_HEAD(nvmem_notifier);
                                 ^
   drivers/nvmem/core.c:1709:44: error: use of undeclared identifier 'nvmem_of_notifier'; did you mean 'nvmem_notifier'?
                   WARN_ON(of_reconfig_notifier_unregister(&nvmem_of_notifier));
                                                            ^~~~~~~~~~~~~~~~~
                                                            nvmem_notifier
   include/asm-generic/bug.h:119:25: note: expanded from macro 'WARN_ON'
           int __ret_warn_on = !!(condition);                              \
                                  ^
   drivers/nvmem/core.c:67:31: note: 'nvmem_notifier' declared here
   static BLOCKING_NOTIFIER_HEAD(nvmem_notifier);
                                 ^
   2 errors generated.

vim +1701 drivers/nvmem/core.c

  1691	
  1692	static int __init nvmem_init(void)
  1693	{
  1694		int rval;
  1695	
  1696		rval = bus_register(&nvmem_bus_type);
  1697		if (rval)
  1698			return rval;
  1699	
  1700		if (IS_ENABLED(CONFIG_OF_DYNAMIC))
> 1701			WARN_ON(of_reconfig_notifier_register(&nvmem_of_notifier));
  1702	
  1703		return 0;
  1704	}
  1705	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 30224 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2020-10-15  2:36 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-10-14 21:41 [PATCH 0/2] nvmem: add DT overlay support for cells Michael Auchter
2020-10-14 21:41 ` [PATCH 1/2] nvmem: core: extract function to add cell from OF Michael Auchter
2020-10-14 21:41 ` [PATCH 2/2] nvmem: core: add OF_RECONFIG handler for nvmem cells Michael Auchter
2020-10-15  0:13   ` kernel test robot
2020-10-15  0:13   ` [RFC PATCH] nvmem: core: nvmem_of_notifier can be static kernel test robot
2020-10-15  2:35   ` [PATCH 2/2] nvmem: core: add OF_RECONFIG handler for nvmem cells kernel test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).