1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- From f6c052afe6f802d87c74153b7a57c43b2e9faf07 Mon Sep 17 00:00:00 2001
- From: Christophe Kerello <[email protected]>
- 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: [email protected]
- Signed-off-by: Christophe Kerello <[email protected]>
- Signed-off-by: Srinivas Kandagatla <[email protected]>
- Link: https://lore.kernel.org/r/[email protected]
- Signed-off-by: Greg Kroah-Hartman <[email protected]>
- ---
- 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;
|