69 lines
2.8 KiB
Diff
69 lines
2.8 KiB
Diff
From f6c052afe6f802d87c74153b7a57c43b2e9faf07 Mon Sep 17 00:00:00 2001
|
|
From: Christophe Kerello <christophe.kerello@foss.st.com>
|
|
Date: Sun, 20 Feb 2022 15:14:31 +0000
|
|
Subject: [PATCH] nvmem: core: Fix a conflict between MTD and NVMEM on wp-gpios
|
|
property
|
|
|
|
Wp-gpios property can be used on NVMEM nodes and the same property can
|
|
be also used on MTD NAND nodes. In case of the wp-gpios property is
|
|
defined at NAND level node, the GPIO management is done at NAND driver
|
|
level. Write protect is disabled when the driver is probed or resumed
|
|
and is enabled when the driver is released or suspended.
|
|
|
|
When no partitions are defined in the NAND DT node, then the NAND DT node
|
|
will be passed to NVMEM framework. If wp-gpios property is defined in
|
|
this node, the GPIO resource is taken twice and the NAND controller
|
|
driver fails to probe.
|
|
|
|
It would be possible to set config->wp_gpio at MTD level before calling
|
|
nvmem_register function but NVMEM framework will toggle this GPIO on
|
|
each write when this GPIO should only be controlled at NAND level driver
|
|
to ensure that the Write Protect has not been enabled.
|
|
|
|
A way to fix this conflict is to add a new boolean flag in nvmem_config
|
|
named ignore_wp. In case ignore_wp is set, the GPIO resource will
|
|
be managed by the provider.
|
|
|
|
Fixes: 2a127da461a9 ("nvmem: add support for the write-protect pin")
|
|
Cc: stable@vger.kernel.org
|
|
Signed-off-by: Christophe Kerello <christophe.kerello@foss.st.com>
|
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
|
Link: https://lore.kernel.org/r/20220220151432.16605-2-srinivas.kandagatla@linaro.org
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
---
|
|
drivers/nvmem/core.c | 2 +-
|
|
include/linux/nvmem-provider.h | 4 +++-
|
|
2 files changed, 4 insertions(+), 2 deletions(-)
|
|
|
|
--- a/drivers/nvmem/core.c
|
|
+++ b/drivers/nvmem/core.c
|
|
@@ -771,7 +771,7 @@ struct nvmem_device *nvmem_register(cons
|
|
|
|
if (config->wp_gpio)
|
|
nvmem->wp_gpio = config->wp_gpio;
|
|
- else
|
|
+ else if (!config->ignore_wp)
|
|
nvmem->wp_gpio = gpiod_get_optional(config->dev, "wp",
|
|
GPIOD_OUT_HIGH);
|
|
if (IS_ERR(nvmem->wp_gpio)) {
|
|
--- a/include/linux/nvmem-provider.h
|
|
+++ b/include/linux/nvmem-provider.h
|
|
@@ -70,7 +70,8 @@ struct nvmem_keepout {
|
|
* @word_size: Minimum read/write access granularity.
|
|
* @stride: Minimum read/write access stride.
|
|
* @priv: User context passed to read/write callbacks.
|
|
- * @wp-gpio: Write protect pin
|
|
+ * @wp-gpio: Write protect pin
|
|
+ * @ignore_wp: Write Protect pin is managed by the provider.
|
|
*
|
|
* Note: A default "nvmem<id>" name will be assigned to the device if
|
|
* no name is specified in its configuration. In such case "<id>" is
|
|
@@ -92,6 +93,7 @@ struct nvmem_config {
|
|
enum nvmem_type type;
|
|
bool read_only;
|
|
bool root_only;
|
|
+ bool ignore_wp;
|
|
struct device_node *of_node;
|
|
bool no_of_node;
|
|
nvmem_reg_read_t reg_read;
|