forked from Openwrt/openwrt
323072f3a6
They add NVMEM layouts support. It allows handling NVMEM content independently of NVMEM device access. Skip U-Boot env data patch for now as it break our downstream MAC hacks. Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
53 lines
2.0 KiB
Diff
53 lines
2.0 KiB
Diff
From b1c37bec1ccfe5ccab72bc0ddc0dfa45c43e2de2 Mon Sep 17 00:00:00 2001
|
|
From: Miquel Raynal <miquel.raynal@bootlin.com>
|
|
Date: Tue, 4 Apr 2023 18:21:23 +0100
|
|
Subject: [PATCH] nvmem: core: request layout modules loading
|
|
|
|
When a storage device like an eeprom or an mtd device probes, it
|
|
registers an nvmem device if the nvmem subsystem has been enabled (bool
|
|
symbol). During nvmem registration, if the device is using layouts to
|
|
expose dynamic nvmem cells, the core will first try to get a reference
|
|
over the layout driver callbacks. In practice there is not relationship
|
|
that can be described between the storage driver and the nvmem
|
|
layout. So there is no way we can enforce both drivers will be built-in
|
|
or both will be modules. If the storage device driver is built-in but
|
|
the layout is built as a module, instead of badly failing with an
|
|
endless probe deferral loop, lets just make a modprobe call in case the
|
|
driver was made available in an initramfs with
|
|
of_device_node_request_module(), and offer a fully functional system to
|
|
the user.
|
|
|
|
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
|
Tested-by: Michael Walle <michael@walle.cc>
|
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
|
Link: https://lore.kernel.org/r/20230404172148.82422-16-srinivas.kandagatla@linaro.org
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
---
|
|
drivers/nvmem/core.c | 8 ++++++++
|
|
1 file changed, 8 insertions(+)
|
|
|
|
--- a/drivers/nvmem/core.c
|
|
+++ b/drivers/nvmem/core.c
|
|
@@ -17,6 +17,7 @@
|
|
#include <linux/nvmem-provider.h>
|
|
#include <linux/gpio/consumer.h>
|
|
#include <linux/of.h>
|
|
+#include <linux/of_device.h>
|
|
#include <linux/slab.h>
|
|
|
|
struct nvmem_device {
|
|
@@ -761,6 +762,13 @@ static struct nvmem_layout *nvmem_layout
|
|
if (!layout_np)
|
|
return NULL;
|
|
|
|
+ /*
|
|
+ * In case the nvmem device was built-in while the layout was built as a
|
|
+ * module, we shall manually request the layout driver loading otherwise
|
|
+ * we'll never have any match.
|
|
+ */
|
|
+ of_request_module(layout_np);
|
|
+
|
|
spin_lock(&nvmem_layout_lock);
|
|
|
|
list_for_each_entry(l, &nvmem_layouts, node) {
|