[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <c37d2d5d-4a25-27de-3f80-033984232ed9@linaro.org>
Date: Fri, 10 Mar 2023 10:30:14 +0000
From: Srinivas Kandagatla <srinivas.kandagatla@...aro.org>
To: Miquel Raynal <miquel.raynal@...tlin.com>,
linux-kernel@...r.kernel.org
Cc: Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
Michael Walle <michael@...le.cc>,
Rafał Miłecki <rafal@...ecki.pl>,
Robert Marko <robert.marko@...tura.hr>,
Luka Perkov <luka.perkov@...tura.hr>,
Thomas Petazzoni <thomas.petazzoni@...tlin.com>,
Rob Herring <robh+dt@...nel.org>,
Frank Rowand <frowand.list@...il.com>,
devicetree@...r.kernel.org
Subject: Re: [PATCH v2 11/21] nvmem: core: handle the absence of expected
layouts
On 07/03/2023 16:53, Miquel Raynal wrote:
> Make nvmem_layout_get() return -EPROBE_DEFER while the expected layout
> is not available. This condition cannot be triggered today as nvmem
> layout drivers are initialed as part of an early init call, but soon
> these drivers will be converted into modules and be initialized with a
> standard priority, so the unavailability of the drivers might become a
> reality that must be taken care of.
>
> Let's anticipate this by telling the caller the layout might not yet be
> available. A probe deferral is requested in this case.
>
> Please note this does not affect any nvmem device not using layouts,
> because an early check against the "nvmem-layout" container presence
> will return NULL in this case.
>
> Signed-off-by: Miquel Raynal <miquel.raynal@...tlin.com>
> Tested-by: Michael Walle <michael@...le.cc>
> ---
> drivers/nvmem/core.c | 10 +++++++++-
> 1 file changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c
> index b9be1faeb7be..51fd792b8d70 100644
> --- a/drivers/nvmem/core.c
> +++ b/drivers/nvmem/core.c
> @@ -755,7 +755,7 @@ EXPORT_SYMBOL_GPL(nvmem_layout_unregister);
> static struct nvmem_layout *nvmem_layout_get(struct nvmem_device *nvmem)
> {
Any reason why this is not part of 10/21?
kernel doc for nvmem_layout_get needs updating with this behavior.
--srini
> struct device_node *layout_np, *np = nvmem->dev.of_node;
> - struct nvmem_layout *l, *layout = NULL;
> + struct nvmem_layout *l, *layout = ERR_PTR(-EPROBE_DEFER);
>
> layout_np = of_get_child_by_name(np, "nvmem-layout");
> if (!layout_np)
> @@ -938,6 +938,13 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config)
> * pointer will be NULL and nvmem_layout_put() will be a noop.
> */
> nvmem->layout = config->layout ?: nvmem_layout_get(nvmem);
> + if (IS_ERR(nvmem->layout)) {
> + rval = PTR_ERR(nvmem->layout);
> + nvmem->layout = NULL;
> +
> + if (rval == -EPROBE_DEFER)
> + goto err_teardown_compat;
> + }
>
> if (config->cells) {
> rval = nvmem_add_cells(nvmem, config->cells, config->ncells);
> @@ -970,6 +977,7 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config)
> err_remove_cells:
> nvmem_device_remove_all_cells(nvmem);
> nvmem_layout_put(nvmem->layout);
> +err_teardown_compat:
> if (config->compat)
> nvmem_sysfs_remove_compat(nvmem, config);
> err_put_device:
Powered by blists - more mailing lists