Linux kernel -stable discussions
 help / color / mirror / Atom feed
From: Srinivas Kandagatla <srini@kernel.org>
To: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>,
	Srinivas Kandagatla <srini@kernel.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: "Miquel Raynal" <miquel.raynal@bootlin.com>,
	"Grégory Clement" <gregory.clement@bootlin.com>,
	"Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
	linux-kernel@vger.kernel.org, stable@vger.kernel.org
Subject: Re: [PATCH v2 1/2] nvmem: layouts: Add fixed-layout driver
Date: Tue, 19 May 2026 15:59:37 +0100	[thread overview]
Message-ID: <a13529db-a85a-4cee-9269-17c0f8fc9781@kernel.org> (raw)
In-Reply-To: <20260515-mathieu-nvmem-fixed-layout-v2-1-8ac215dd4016@bootlin.com>



On 5/15/26 12:56 PM, Mathieu Dubois-Briand wrote:
> Current implementation isn't working well when device tree nodes have a
> phandle on a fixed-layout nvmem node. As the fixed layout is handled in
> nvmem core, no driver is ever associated with the layout, and the device
> consumer driver probe is deferred indefinitely.
> 
> Remove the specific handling of fixed-layout and add a layout driver.
> This makes the fixed-layout similar to all other layouts, fixing the
> whole issue.
> 
> Fixes: fc29fd821d9a ("nvmem: core: Rework layouts to become regular devices")
> Cc: stable@vger.kernel.org
> Signed-off-by: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>
> ---
>  MAINTAINERS                          |  5 ++++
>  drivers/nvmem/core.c                 | 23 +---------------
>  drivers/nvmem/layouts.c              | 11 --------
>  drivers/nvmem/layouts/Makefile       |  1 +
>  drivers/nvmem/layouts/fixed-layout.c | 52 ++++++++++++++++++++++++++++++++++++
>  include/linux/nvmem-provider.h       |  7 +++++
>  6 files changed, 66 insertions(+), 33 deletions(-)
> 
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 882214b0e7db..c48c4e129736 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -10018,6 +10018,11 @@ F:	drivers/base/firmware_loader/
>  F:	rust/kernel/firmware.rs
>  F:	include/linux/firmware.h
>  
> +FIXED-LAYOUT NVMEM LAYOUT DRIVER
> +M:	Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>
> +S:	Maintained
> +F:	drivers/nvmem/layouts/fixed-layout.c
> +
>  FLEXTIMER FTM-QUADDEC DRIVER
>  M:	Patrick Havelange <patrick.havelange@essensium.com>
>  L:	linux-iio@vger.kernel.org
> diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c
> index 311cb2e5a5c0..0ec4924c4bda 100644
> --- a/drivers/nvmem/core.c
> +++ b/drivers/nvmem/core.c
> @@ -786,7 +786,7 @@ static int nvmem_validate_keepouts(struct nvmem_device *nvmem)
>  	return 0;
>  }
>  
> -static int nvmem_add_cells_from_dt(struct nvmem_device *nvmem, struct device_node *np)
> +int nvmem_add_cells_from_dt(struct nvmem_device *nvmem, struct device_node *np)

Export this in this patch itself.

>  {
>  	struct device *dev = &nvmem->dev;
>  	const __be32 *addr;
> @@ -840,23 +840,6 @@ static int nvmem_add_cells_from_legacy_of(struct nvmem_device *nvmem)
>  	return nvmem_add_cells_from_dt(nvmem, nvmem->dev.of_node);
>  }
>  
> -static int nvmem_add_cells_from_fixed_layout(struct nvmem_device *nvmem)
> -{
> -	struct device_node *layout_np;
> -	int err = 0;
> -
> -	layout_np = of_nvmem_layout_get_container(nvmem);
> -	if (!layout_np)
> -		return 0;
> -
> -	if (of_device_is_compatible(layout_np, "fixed-layout"))
> -		err = nvmem_add_cells_from_dt(nvmem, layout_np);
> -
> -	of_node_put(layout_np);
> -
> -	return err;
> -}
> -
>  int nvmem_layout_register(struct nvmem_layout *layout)
>  {
>  	int ret;
> @@ -1005,10 +988,6 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config)
>  			goto err_remove_cells;
>  	}
>  
> -	rval = nvmem_add_cells_from_fixed_layout(nvmem);
> -	if (rval)
> -		goto err_remove_cells;
> -
>  	dev_dbg(&nvmem->dev, "Registering nvmem device %s\n", config->name);
>  
>  	rval = device_add(&nvmem->dev);
> diff --git a/drivers/nvmem/layouts.c b/drivers/nvmem/layouts.c
> index b90584e1b99e..07a34be9669c 100644
> --- a/drivers/nvmem/layouts.c
> +++ b/drivers/nvmem/layouts.c
> @@ -125,11 +125,6 @@ static int nvmem_layout_create_device(struct nvmem_device *nvmem,
>  	return 0;
>  }
>  
> -static const struct of_device_id of_nvmem_layout_skip_table[] = {
> -	{ .compatible = "fixed-layout", },
> -	{}
> -};
> -
>  static int nvmem_layout_bus_populate(struct nvmem_device *nvmem,
>  				     struct device_node *layout_dn)
>  {
> @@ -142,12 +137,6 @@ static int nvmem_layout_bus_populate(struct nvmem_device *nvmem,
>  		return 0;
>  	}
>  
> -	/* Fixed layouts are parsed manually somewhere else for now */
> -	if (of_match_node(of_nvmem_layout_skip_table, layout_dn)) {
> -		pr_debug("%s() - skipping %pOF node\n", __func__, layout_dn);
> -		return 0;
> -	}
> -
>  	if (of_node_check_flag(layout_dn, OF_POPULATED_BUS)) {
>  		pr_debug("%s() - skipping %pOF, already populated\n",
>  			 __func__, layout_dn);
> diff --git a/drivers/nvmem/layouts/Makefile b/drivers/nvmem/layouts/Makefile
> index 4940c9db0665..dd6c6c70b1a9 100644
> --- a/drivers/nvmem/layouts/Makefile
> +++ b/drivers/nvmem/layouts/Makefile
> @@ -3,6 +3,7 @@
>  # Makefile for nvmem layouts.
>  #
>  
> +obj-$(CONFIG_NVMEM_LAYOUTS) += fixed-layout.o
>  obj-$(CONFIG_NVMEM_LAYOUT_SL28_VPD) += sl28vpd.o
>  obj-$(CONFIG_NVMEM_LAYOUT_ONIE_TLV) += onie-tlv.o
>  obj-$(CONFIG_NVMEM_LAYOUT_U_BOOT_ENV) += u-boot-env.o
> diff --git a/drivers/nvmem/layouts/fixed-layout.c b/drivers/nvmem/layouts/fixed-layout.c
> new file mode 100644
> index 000000000000..bc7da9a904d4
> --- /dev/null
> +++ b/drivers/nvmem/layouts/fixed-layout.c
> @@ -0,0 +1,52 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Copyright 2026 Bootlin
> + *
> + * Authors: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>
> + */
> +
> +#include <linux/nvmem-provider.h>
> +#include <linux/of.h>
> +
> +static int fixed_layout_add_cells(struct nvmem_layout *layout)
> +{
> +	struct device_node *np;
> +
> +	np = of_nvmem_layout_get_container(layout->nvmem);
> +	if (!np)
> +		return -ENOENT;
> +
> +	return nvmem_add_cells_from_dt(layout->nvmem, np);

np is leaking here.

> +}
> +
> +static int fixed_layout_probe(struct nvmem_layout *layout)
> +{
> +	layout->add_cells = fixed_layout_add_cells;
> +
> +	return nvmem_layout_register(layout);
> +}
> +
> +static void fixed_layout_remove(struct nvmem_layout *layout)
> +{
> +	nvmem_layout_unregister(layout);
> +}
> +
> +static const struct of_device_id fixed_layout_of_match_table[] = {
> +	{ .compatible = "fixed-layout", },
> +	{},
> +};
> +
> +static struct nvmem_layout_driver fixed_layout_layout = {
> +	.driver = {
> +		.name = "fixed-layout",
> +		.of_match_table = fixed_layout_of_match_table,
> +	},
> +	.probe = fixed_layout_probe,
> +	.remove = fixed_layout_remove,
> +};
> +module_nvmem_layout_driver(fixed_layout_layout);
> +
> +MODULE_AUTHOR("Mathieu Dubois-Briand");
> +MODULE_LICENSE("GPL");
> +MODULE_DEVICE_TABLE(of, fixed_layout_of_match_table);
> +MODULE_DESCRIPTION("NVMEM fixed-layout driver");
> diff --git a/include/linux/nvmem-provider.h b/include/linux/nvmem-provider.h
> index f3b13da78aac..e7eaa9a89b8b 100644
> --- a/include/linux/nvmem-provider.h
> +++ b/include/linux/nvmem-provider.h
> @@ -176,6 +176,7 @@ int nvmem_add_one_cell(struct nvmem_device *nvmem,
>  
>  int nvmem_layout_register(struct nvmem_layout *layout);
>  void nvmem_layout_unregister(struct nvmem_layout *layout);
> +int nvmem_add_cells_from_dt(struct nvmem_device *nvmem, struct device_node *np);
>  
>  #define nvmem_layout_driver_register(drv) \
>  	__nvmem_layout_driver_register(drv, THIS_MODULE)
> @@ -214,6 +215,12 @@ static inline int nvmem_layout_register(struct nvmem_layout *layout)
>  
>  static inline void nvmem_layout_unregister(struct nvmem_layout *layout) {}
>  
> +static inline int nvmem_add_cells_from_dt(struct nvmem_device *nvmem,
> +					  struct device_node *np)
> +{
> +	return -EOPNOTSUPP;
> +}
> +
>  #endif /* CONFIG_NVMEM */
>  
>  #if IS_ENABLED(CONFIG_NVMEM) && IS_ENABLED(CONFIG_OF)
> 


  parent reply	other threads:[~2026-05-19 14:59 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-15 11:56 [PATCH v2 0/2] nvmem: layouts: Add fixed-layout driver Mathieu Dubois-Briand
2026-05-15 11:56 ` [PATCH v2 1/2] " Mathieu Dubois-Briand
2026-05-18  7:40   ` Miquel Raynal
2026-05-19 14:59   ` Srinivas Kandagatla [this message]
2026-05-19 15:02   ` Srinivas Kandagatla
2026-05-15 11:56 ` [PATCH v2 2/2] nvmem: layouts: Make the fixed-layout driver optional Mathieu Dubois-Briand
2026-05-18  7:41   ` Miquel Raynal

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=a13529db-a85a-4cee-9269-17c0f8fc9781@kernel.org \
    --to=srini@kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=gregory.clement@bootlin.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mathieu.dubois-briand@bootlin.com \
    --cc=miquel.raynal@bootlin.com \
    --cc=stable@vger.kernel.org \
    --cc=thomas.petazzoni@bootlin.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox