All of lore.kernel.org
 help / color / mirror / Atom feed
From: Boris Brezillon <boris.brezillon@bootlin.com>
To: Bartosz Golaszewski <brgl@bgdev.pl>
Cc: Sekhar Nori <nsekhar@ti.com>, Kevin Hilman <khilman@kernel.org>,
	Russell King <linux@armlinux.org.uk>,
	Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	David Woodhouse <dwmw2@infradead.org>,
	Brian Norris <computersforpeace@gmail.com>,
	Marek Vasut <marek.vasut@gmail.com>,
	Richard Weinberger <richard@nod.at>,
	Nicolas Ferre <nicolas.ferre@microchip.com>,
	"David S . Miller" <davem@davemloft.net>,
	Grygorii Strashko <grygorii.strashko@ti.com>,
	Srinivas Kandagatla <srinivas.kandagatla@linaro.org>,
	Andrew Lunn <andrew@lunn.ch>,
	Florian Fainelli <f.fainelli@gmail.com>,
	Rob Herring <robh+dt@kernel.org>,
	Frank Rowand <frowand.list@gmail.com>,
	Wolfram Sang <wsa@the-dreams.de>,
	devicetree@vger.kernel.org, netdev@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	Bartosz Golaszewski <bgolaszewski@baylibre.com>,
	linux-mtd@lists.infradead.org, linux-i2c@vger.kernel.org,
	Alban Bedel <albeu@free.fr>,
	linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v2 02/25] mtd: add support for reading MTD devices via the nvmem API
Date: Sun, 18 Nov 2018 17:06:24 +0100	[thread overview]
Message-ID: <20181118170624.33daaaf9@bbrezillon> (raw)
In-Reply-To: <20181113140133.17385-3-brgl@bgdev.pl>

On Tue, 13 Nov 2018 15:01:10 +0100
Bartosz Golaszewski <brgl@bgdev.pl> wrote:

> From: Alban Bedel <albeu@free.fr>
> 
> Allow drivers that use the nvmem API to read data stored on MTD devices.
> For this the mtd devices are registered as read-only NVMEM providers.
> 
> We don't support device tree systems for now.
> 
> Signed-off-by: Alban Bedel <albeu@free.fr>
> [Bartosz:
>   - include linux/nvmem-provider.h
>   - set the name of the nvmem provider
>   - set no_of_node to true in nvmem_config
>   - don't check the return value of nvmem_unregister() - it cannot fail
>   - tweaked the commit message]
> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>

Acked-by: Boris Brezillon <boris.brezillon@bootlin.com>

To the person taking this patch (Greg?): I'll need an immutable tag,
just in case we end up with other changes in mtdcore.c for this release.

> ---
>  drivers/mtd/Kconfig     |  1 +
>  drivers/mtd/mtdcore.c   | 56 +++++++++++++++++++++++++++++++++++++++++
>  include/linux/mtd/mtd.h |  2 ++
>  3 files changed, 59 insertions(+)
> 
> diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
> index c77f537323ec..efbe7a6f1d8f 100644
> --- a/drivers/mtd/Kconfig
> +++ b/drivers/mtd/Kconfig
> @@ -1,5 +1,6 @@
>  menuconfig MTD
>  	tristate "Memory Technology Device (MTD) support"
> +	imply NVMEM
>  	help
>  	  Memory Technology Devices are flash, RAM and similar chips, often
>  	  used for solid state file systems on embedded devices. This option
> diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
> index 97ac219c082e..5f1053d995b0 100644
> --- a/drivers/mtd/mtdcore.c
> +++ b/drivers/mtd/mtdcore.c
> @@ -41,6 +41,7 @@
>  #include <linux/reboot.h>
>  #include <linux/leds.h>
>  #include <linux/debugfs.h>
> +#include <linux/nvmem-provider.h>
>  
>  #include <linux/mtd/mtd.h>
>  #include <linux/mtd/partitions.h>
> @@ -488,6 +489,50 @@ int mtd_pairing_groups(struct mtd_info *mtd)
>  }
>  EXPORT_SYMBOL_GPL(mtd_pairing_groups);
>  
> +static int mtd_nvmem_reg_read(void *priv, unsigned int offset,
> +			      void *val, size_t bytes)
> +{
> +	struct mtd_info *mtd = priv;
> +	size_t retlen;
> +	int err;
> +
> +	err = mtd_read(mtd, offset, bytes, &retlen, val);
> +	if (err && err != -EUCLEAN)
> +		return err;
> +
> +	return retlen == bytes ? 0 : -EIO;
> +}
> +
> +static int mtd_nvmem_add(struct mtd_info *mtd)
> +{
> +	struct nvmem_config config = {};
> +
> +	config.dev = &mtd->dev;
> +	config.name = mtd->name;
> +	config.owner = THIS_MODULE;
> +	config.reg_read = mtd_nvmem_reg_read;
> +	config.size = mtd->size;
> +	config.word_size = 1;
> +	config.stride = 1;
> +	config.read_only = true;
> +	config.root_only = true;
> +	config.no_of_node = true;
> +	config.priv = mtd;
> +
> +	mtd->nvmem = nvmem_register(&config);
> +	if (IS_ERR(mtd->nvmem)) {
> +		/* Just ignore if there is no NVMEM support in the kernel */
> +		if (PTR_ERR(mtd->nvmem) == -ENOSYS) {
> +			mtd->nvmem = NULL;
> +		} else {
> +			dev_err(&mtd->dev, "Failed to register NVMEM device\n");
> +			return PTR_ERR(mtd->nvmem);
> +		}
> +	}
> +
> +	return 0;
> +}
> +
>  static struct dentry *dfs_dir_mtd;
>  
>  /**
> @@ -570,6 +615,11 @@ int add_mtd_device(struct mtd_info *mtd)
>  	if (error)
>  		goto fail_added;
>  
> +	/* Add the nvmem provider */
> +	error = mtd_nvmem_add(mtd);
> +	if (error)
> +		goto fail_nvmem_add;
> +
>  	if (!IS_ERR_OR_NULL(dfs_dir_mtd)) {
>  		mtd->dbg.dfs_dir = debugfs_create_dir(dev_name(&mtd->dev), dfs_dir_mtd);
>  		if (IS_ERR_OR_NULL(mtd->dbg.dfs_dir)) {
> @@ -595,6 +645,8 @@ int add_mtd_device(struct mtd_info *mtd)
>  	__module_get(THIS_MODULE);
>  	return 0;
>  
> +fail_nvmem_add:
> +	device_unregister(&mtd->dev);
>  fail_added:
>  	of_node_put(mtd_get_of_node(mtd));
>  	idr_remove(&mtd_idr, i);
> @@ -637,6 +689,10 @@ int del_mtd_device(struct mtd_info *mtd)
>  		       mtd->index, mtd->name, mtd->usecount);
>  		ret = -EBUSY;
>  	} else {
> +		/* Try to remove the NVMEM provider */
> +		if (mtd->nvmem)
> +			nvmem_unregister(mtd->nvmem);
> +
>  		device_unregister(&mtd->dev);
>  
>  		idr_remove(&mtd_idr, mtd->index);
> diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
> index cd0be91bdefa..545070c2ee64 100644
> --- a/include/linux/mtd/mtd.h
> +++ b/include/linux/mtd/mtd.h
> @@ -25,6 +25,7 @@
>  #include <linux/notifier.h>
>  #include <linux/device.h>
>  #include <linux/of.h>
> +#include <linux/nvmem-provider.h>
>  
>  #include <mtd/mtd-abi.h>
>  
> @@ -341,6 +342,7 @@ struct mtd_info {
>  	struct device dev;
>  	int usecount;
>  	struct mtd_debug_info dbg;
> +	struct nvmem_device *nvmem;
>  };
>  
>  int mtd_ooblayout_ecc(struct mtd_info *mtd, int section,


WARNING: multiple messages have this Message-ID (diff)
From: Boris Brezillon <boris.brezillon@bootlin.com>
To: Bartosz Golaszewski <brgl@bgdev.pl>
Cc: Sekhar Nori <nsekhar@ti.com>, Kevin Hilman <khilman@kernel.org>,
	Russell King <linux@armlinux.org.uk>,
	Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	David Woodhouse <dwmw2@infradead.org>,
	Brian Norris <computersforpeace@gmail.com>,
	Marek Vasut <marek.vasut@gmail.com>,
	Richard Weinberger <richard@nod.at>,
	Nicolas Ferre <nicolas.ferre@microchip.com>,
	"David S . Miller" <davem@davemloft.net>,
	Grygorii Strashko <grygorii.strashko@ti.com>,
	Srinivas Kandagatla <srinivas.kandagatla@linaro.org>,
	Andrew Lunn <andrew@lunn.ch>,
	Florian Fainelli <f.fainelli@gmail.com>,
	Rob Herring <robh+dt@kernel.org>,
	Frank Rowand <frowand.list@gmail.com>,
	Wolfram Sang <wsa@the-dreams.de>,
	devicetree@vger.kernel.org, netdev@vger.kernel.org, lin
Subject: Re: [PATCH v2 02/25] mtd: add support for reading MTD devices via the nvmem API
Date: Sun, 18 Nov 2018 17:06:24 +0100	[thread overview]
Message-ID: <20181118170624.33daaaf9@bbrezillon> (raw)
In-Reply-To: <20181113140133.17385-3-brgl@bgdev.pl>

On Tue, 13 Nov 2018 15:01:10 +0100
Bartosz Golaszewski <brgl@bgdev.pl> wrote:

> From: Alban Bedel <albeu@free.fr>
> 
> Allow drivers that use the nvmem API to read data stored on MTD devices.
> For this the mtd devices are registered as read-only NVMEM providers.
> 
> We don't support device tree systems for now.
> 
> Signed-off-by: Alban Bedel <albeu@free.fr>
> [Bartosz:
>   - include linux/nvmem-provider.h
>   - set the name of the nvmem provider
>   - set no_of_node to true in nvmem_config
>   - don't check the return value of nvmem_unregister() - it cannot fail
>   - tweaked the commit message]
> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>

Acked-by: Boris Brezillon <boris.brezillon@bootlin.com>

To the person taking this patch (Greg?): I'll need an immutable tag,
just in case we end up with other changes in mtdcore.c for this release.

> ---
>  drivers/mtd/Kconfig     |  1 +
>  drivers/mtd/mtdcore.c   | 56 +++++++++++++++++++++++++++++++++++++++++
>  include/linux/mtd/mtd.h |  2 ++
>  3 files changed, 59 insertions(+)
> 
> diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
> index c77f537323ec..efbe7a6f1d8f 100644
> --- a/drivers/mtd/Kconfig
> +++ b/drivers/mtd/Kconfig
> @@ -1,5 +1,6 @@
>  menuconfig MTD
>  	tristate "Memory Technology Device (MTD) support"
> +	imply NVMEM
>  	help
>  	  Memory Technology Devices are flash, RAM and similar chips, often
>  	  used for solid state file systems on embedded devices. This option
> diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
> index 97ac219c082e..5f1053d995b0 100644
> --- a/drivers/mtd/mtdcore.c
> +++ b/drivers/mtd/mtdcore.c
> @@ -41,6 +41,7 @@
>  #include <linux/reboot.h>
>  #include <linux/leds.h>
>  #include <linux/debugfs.h>
> +#include <linux/nvmem-provider.h>
>  
>  #include <linux/mtd/mtd.h>
>  #include <linux/mtd/partitions.h>
> @@ -488,6 +489,50 @@ int mtd_pairing_groups(struct mtd_info *mtd)
>  }
>  EXPORT_SYMBOL_GPL(mtd_pairing_groups);
>  
> +static int mtd_nvmem_reg_read(void *priv, unsigned int offset,
> +			      void *val, size_t bytes)
> +{
> +	struct mtd_info *mtd = priv;
> +	size_t retlen;
> +	int err;
> +
> +	err = mtd_read(mtd, offset, bytes, &retlen, val);
> +	if (err && err != -EUCLEAN)
> +		return err;
> +
> +	return retlen == bytes ? 0 : -EIO;
> +}
> +
> +static int mtd_nvmem_add(struct mtd_info *mtd)
> +{
> +	struct nvmem_config config = {};
> +
> +	config.dev = &mtd->dev;
> +	config.name = mtd->name;
> +	config.owner = THIS_MODULE;
> +	config.reg_read = mtd_nvmem_reg_read;
> +	config.size = mtd->size;
> +	config.word_size = 1;
> +	config.stride = 1;
> +	config.read_only = true;
> +	config.root_only = true;
> +	config.no_of_node = true;
> +	config.priv = mtd;
> +
> +	mtd->nvmem = nvmem_register(&config);
> +	if (IS_ERR(mtd->nvmem)) {
> +		/* Just ignore if there is no NVMEM support in the kernel */
> +		if (PTR_ERR(mtd->nvmem) == -ENOSYS) {
> +			mtd->nvmem = NULL;
> +		} else {
> +			dev_err(&mtd->dev, "Failed to register NVMEM device\n");
> +			return PTR_ERR(mtd->nvmem);
> +		}
> +	}
> +
> +	return 0;
> +}
> +
>  static struct dentry *dfs_dir_mtd;
>  
>  /**
> @@ -570,6 +615,11 @@ int add_mtd_device(struct mtd_info *mtd)
>  	if (error)
>  		goto fail_added;
>  
> +	/* Add the nvmem provider */
> +	error = mtd_nvmem_add(mtd);
> +	if (error)
> +		goto fail_nvmem_add;
> +
>  	if (!IS_ERR_OR_NULL(dfs_dir_mtd)) {
>  		mtd->dbg.dfs_dir = debugfs_create_dir(dev_name(&mtd->dev), dfs_dir_mtd);
>  		if (IS_ERR_OR_NULL(mtd->dbg.dfs_dir)) {
> @@ -595,6 +645,8 @@ int add_mtd_device(struct mtd_info *mtd)
>  	__module_get(THIS_MODULE);
>  	return 0;
>  
> +fail_nvmem_add:
> +	device_unregister(&mtd->dev);
>  fail_added:
>  	of_node_put(mtd_get_of_node(mtd));
>  	idr_remove(&mtd_idr, i);
> @@ -637,6 +689,10 @@ int del_mtd_device(struct mtd_info *mtd)
>  		       mtd->index, mtd->name, mtd->usecount);
>  		ret = -EBUSY;
>  	} else {
> +		/* Try to remove the NVMEM provider */
> +		if (mtd->nvmem)
> +			nvmem_unregister(mtd->nvmem);
> +
>  		device_unregister(&mtd->dev);
>  
>  		idr_remove(&mtd_idr, mtd->index);
> diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
> index cd0be91bdefa..545070c2ee64 100644
> --- a/include/linux/mtd/mtd.h
> +++ b/include/linux/mtd/mtd.h
> @@ -25,6 +25,7 @@
>  #include <linux/notifier.h>
>  #include <linux/device.h>
>  #include <linux/of.h>
> +#include <linux/nvmem-provider.h>
>  
>  #include <mtd/mtd-abi.h>
>  
> @@ -341,6 +342,7 @@ struct mtd_info {
>  	struct device dev;
>  	int usecount;
>  	struct mtd_debug_info dbg;
> +	struct nvmem_device *nvmem;
>  };
>  
>  int mtd_ooblayout_ecc(struct mtd_info *mtd, int section,

WARNING: multiple messages have this Message-ID (diff)
From: Boris Brezillon <boris.brezillon@bootlin.com>
To: Bartosz Golaszewski <brgl@bgdev.pl>
Cc: Sekhar Nori <nsekhar@ti.com>, Kevin Hilman <khilman@kernel.org>,
	Russell King <linux@armlinux.org.uk>,
	Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	David Woodhouse <dwmw2@infradead.org>,
	Brian Norris <computersforpeace@gmail.com>,
	Marek Vasut <marek.vasut@gmail.com>,
	Richard Weinberger <richard@nod.at>,
	Nicolas Ferre <nicolas.ferre@microchip.com>,
	"David S . Miller" <davem@davemloft.net>,
	Grygorii Strashko <grygorii.strashko@ti.com>,
	Srinivas Kandagatla <srinivas.kandagatla@linaro.org>,
	Andrew Lunn <andrew@lunn.ch>,
	Florian Fainelli <f.fainelli@gmail.com>,
	Rob Herring <robh+dt@kernel.org>,
	Frank Rowand <frowand.list@gmail.com>,
	Wolfram Sang <wsa@the-dreams.de>,
	devicetree@vger.kernel.org, netdev@vger.kernel.orglin
Subject: Re: [PATCH v2 02/25] mtd: add support for reading MTD devices via the nvmem API
Date: Sun, 18 Nov 2018 17:06:24 +0100	[thread overview]
Message-ID: <20181118170624.33daaaf9@bbrezillon> (raw)
In-Reply-To: <20181113140133.17385-3-brgl@bgdev.pl>

On Tue, 13 Nov 2018 15:01:10 +0100
Bartosz Golaszewski <brgl@bgdev.pl> wrote:

> From: Alban Bedel <albeu@free.fr>
> 
> Allow drivers that use the nvmem API to read data stored on MTD devices.
> For this the mtd devices are registered as read-only NVMEM providers.
> 
> We don't support device tree systems for now.
> 
> Signed-off-by: Alban Bedel <albeu@free.fr>
> [Bartosz:
>   - include linux/nvmem-provider.h
>   - set the name of the nvmem provider
>   - set no_of_node to true in nvmem_config
>   - don't check the return value of nvmem_unregister() - it cannot fail
>   - tweaked the commit message]
> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>

Acked-by: Boris Brezillon <boris.brezillon@bootlin.com>

To the person taking this patch (Greg?): I'll need an immutable tag,
just in case we end up with other changes in mtdcore.c for this release.

> ---
>  drivers/mtd/Kconfig     |  1 +
>  drivers/mtd/mtdcore.c   | 56 +++++++++++++++++++++++++++++++++++++++++
>  include/linux/mtd/mtd.h |  2 ++
>  3 files changed, 59 insertions(+)
> 
> diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
> index c77f537323ec..efbe7a6f1d8f 100644
> --- a/drivers/mtd/Kconfig
> +++ b/drivers/mtd/Kconfig
> @@ -1,5 +1,6 @@
>  menuconfig MTD
>  	tristate "Memory Technology Device (MTD) support"
> +	imply NVMEM
>  	help
>  	  Memory Technology Devices are flash, RAM and similar chips, often
>  	  used for solid state file systems on embedded devices. This option
> diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
> index 97ac219c082e..5f1053d995b0 100644
> --- a/drivers/mtd/mtdcore.c
> +++ b/drivers/mtd/mtdcore.c
> @@ -41,6 +41,7 @@
>  #include <linux/reboot.h>
>  #include <linux/leds.h>
>  #include <linux/debugfs.h>
> +#include <linux/nvmem-provider.h>
>  
>  #include <linux/mtd/mtd.h>
>  #include <linux/mtd/partitions.h>
> @@ -488,6 +489,50 @@ int mtd_pairing_groups(struct mtd_info *mtd)
>  }
>  EXPORT_SYMBOL_GPL(mtd_pairing_groups);
>  
> +static int mtd_nvmem_reg_read(void *priv, unsigned int offset,
> +			      void *val, size_t bytes)
> +{
> +	struct mtd_info *mtd = priv;
> +	size_t retlen;
> +	int err;
> +
> +	err = mtd_read(mtd, offset, bytes, &retlen, val);
> +	if (err && err != -EUCLEAN)
> +		return err;
> +
> +	return retlen == bytes ? 0 : -EIO;
> +}
> +
> +static int mtd_nvmem_add(struct mtd_info *mtd)
> +{
> +	struct nvmem_config config = {};
> +
> +	config.dev = &mtd->dev;
> +	config.name = mtd->name;
> +	config.owner = THIS_MODULE;
> +	config.reg_read = mtd_nvmem_reg_read;
> +	config.size = mtd->size;
> +	config.word_size = 1;
> +	config.stride = 1;
> +	config.read_only = true;
> +	config.root_only = true;
> +	config.no_of_node = true;
> +	config.priv = mtd;
> +
> +	mtd->nvmem = nvmem_register(&config);
> +	if (IS_ERR(mtd->nvmem)) {
> +		/* Just ignore if there is no NVMEM support in the kernel */
> +		if (PTR_ERR(mtd->nvmem) == -ENOSYS) {
> +			mtd->nvmem = NULL;
> +		} else {
> +			dev_err(&mtd->dev, "Failed to register NVMEM device\n");
> +			return PTR_ERR(mtd->nvmem);
> +		}
> +	}
> +
> +	return 0;
> +}
> +
>  static struct dentry *dfs_dir_mtd;
>  
>  /**
> @@ -570,6 +615,11 @@ int add_mtd_device(struct mtd_info *mtd)
>  	if (error)
>  		goto fail_added;
>  
> +	/* Add the nvmem provider */
> +	error = mtd_nvmem_add(mtd);
> +	if (error)
> +		goto fail_nvmem_add;
> +
>  	if (!IS_ERR_OR_NULL(dfs_dir_mtd)) {
>  		mtd->dbg.dfs_dir = debugfs_create_dir(dev_name(&mtd->dev), dfs_dir_mtd);
>  		if (IS_ERR_OR_NULL(mtd->dbg.dfs_dir)) {
> @@ -595,6 +645,8 @@ int add_mtd_device(struct mtd_info *mtd)
>  	__module_get(THIS_MODULE);
>  	return 0;
>  
> +fail_nvmem_add:
> +	device_unregister(&mtd->dev);
>  fail_added:
>  	of_node_put(mtd_get_of_node(mtd));
>  	idr_remove(&mtd_idr, i);
> @@ -637,6 +689,10 @@ int del_mtd_device(struct mtd_info *mtd)
>  		       mtd->index, mtd->name, mtd->usecount);
>  		ret = -EBUSY;
>  	} else {
> +		/* Try to remove the NVMEM provider */
> +		if (mtd->nvmem)
> +			nvmem_unregister(mtd->nvmem);
> +
>  		device_unregister(&mtd->dev);
>  
>  		idr_remove(&mtd_idr, mtd->index);
> diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
> index cd0be91bdefa..545070c2ee64 100644
> --- a/include/linux/mtd/mtd.h
> +++ b/include/linux/mtd/mtd.h
> @@ -25,6 +25,7 @@
>  #include <linux/notifier.h>
>  #include <linux/device.h>
>  #include <linux/of.h>
> +#include <linux/nvmem-provider.h>
>  
>  #include <mtd/mtd-abi.h>
>  
> @@ -341,6 +342,7 @@ struct mtd_info {
>  	struct device dev;
>  	int usecount;
>  	struct mtd_debug_info dbg;
> +	struct nvmem_device *nvmem;
>  };
>  
>  int mtd_ooblayout_ecc(struct mtd_info *mtd, int section,

WARNING: multiple messages have this Message-ID (diff)
From: boris.brezillon@bootlin.com (Boris Brezillon)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 02/25] mtd: add support for reading MTD devices via the nvmem API
Date: Sun, 18 Nov 2018 17:06:24 +0100	[thread overview]
Message-ID: <20181118170624.33daaaf9@bbrezillon> (raw)
In-Reply-To: <20181113140133.17385-3-brgl@bgdev.pl>

On Tue, 13 Nov 2018 15:01:10 +0100
Bartosz Golaszewski <brgl@bgdev.pl> wrote:

> From: Alban Bedel <albeu@free.fr>
> 
> Allow drivers that use the nvmem API to read data stored on MTD devices.
> For this the mtd devices are registered as read-only NVMEM providers.
> 
> We don't support device tree systems for now.
> 
> Signed-off-by: Alban Bedel <albeu@free.fr>
> [Bartosz:
>   - include linux/nvmem-provider.h
>   - set the name of the nvmem provider
>   - set no_of_node to true in nvmem_config
>   - don't check the return value of nvmem_unregister() - it cannot fail
>   - tweaked the commit message]
> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>

Acked-by: Boris Brezillon <boris.brezillon@bootlin.com>

To the person taking this patch (Greg?): I'll need an immutable tag,
just in case we end up with other changes in mtdcore.c for this release.

> ---
>  drivers/mtd/Kconfig     |  1 +
>  drivers/mtd/mtdcore.c   | 56 +++++++++++++++++++++++++++++++++++++++++
>  include/linux/mtd/mtd.h |  2 ++
>  3 files changed, 59 insertions(+)
> 
> diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
> index c77f537323ec..efbe7a6f1d8f 100644
> --- a/drivers/mtd/Kconfig
> +++ b/drivers/mtd/Kconfig
> @@ -1,5 +1,6 @@
>  menuconfig MTD
>  	tristate "Memory Technology Device (MTD) support"
> +	imply NVMEM
>  	help
>  	  Memory Technology Devices are flash, RAM and similar chips, often
>  	  used for solid state file systems on embedded devices. This option
> diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
> index 97ac219c082e..5f1053d995b0 100644
> --- a/drivers/mtd/mtdcore.c
> +++ b/drivers/mtd/mtdcore.c
> @@ -41,6 +41,7 @@
>  #include <linux/reboot.h>
>  #include <linux/leds.h>
>  #include <linux/debugfs.h>
> +#include <linux/nvmem-provider.h>
>  
>  #include <linux/mtd/mtd.h>
>  #include <linux/mtd/partitions.h>
> @@ -488,6 +489,50 @@ int mtd_pairing_groups(struct mtd_info *mtd)
>  }
>  EXPORT_SYMBOL_GPL(mtd_pairing_groups);
>  
> +static int mtd_nvmem_reg_read(void *priv, unsigned int offset,
> +			      void *val, size_t bytes)
> +{
> +	struct mtd_info *mtd = priv;
> +	size_t retlen;
> +	int err;
> +
> +	err = mtd_read(mtd, offset, bytes, &retlen, val);
> +	if (err && err != -EUCLEAN)
> +		return err;
> +
> +	return retlen == bytes ? 0 : -EIO;
> +}
> +
> +static int mtd_nvmem_add(struct mtd_info *mtd)
> +{
> +	struct nvmem_config config = {};
> +
> +	config.dev = &mtd->dev;
> +	config.name = mtd->name;
> +	config.owner = THIS_MODULE;
> +	config.reg_read = mtd_nvmem_reg_read;
> +	config.size = mtd->size;
> +	config.word_size = 1;
> +	config.stride = 1;
> +	config.read_only = true;
> +	config.root_only = true;
> +	config.no_of_node = true;
> +	config.priv = mtd;
> +
> +	mtd->nvmem = nvmem_register(&config);
> +	if (IS_ERR(mtd->nvmem)) {
> +		/* Just ignore if there is no NVMEM support in the kernel */
> +		if (PTR_ERR(mtd->nvmem) == -ENOSYS) {
> +			mtd->nvmem = NULL;
> +		} else {
> +			dev_err(&mtd->dev, "Failed to register NVMEM device\n");
> +			return PTR_ERR(mtd->nvmem);
> +		}
> +	}
> +
> +	return 0;
> +}
> +
>  static struct dentry *dfs_dir_mtd;
>  
>  /**
> @@ -570,6 +615,11 @@ int add_mtd_device(struct mtd_info *mtd)
>  	if (error)
>  		goto fail_added;
>  
> +	/* Add the nvmem provider */
> +	error = mtd_nvmem_add(mtd);
> +	if (error)
> +		goto fail_nvmem_add;
> +
>  	if (!IS_ERR_OR_NULL(dfs_dir_mtd)) {
>  		mtd->dbg.dfs_dir = debugfs_create_dir(dev_name(&mtd->dev), dfs_dir_mtd);
>  		if (IS_ERR_OR_NULL(mtd->dbg.dfs_dir)) {
> @@ -595,6 +645,8 @@ int add_mtd_device(struct mtd_info *mtd)
>  	__module_get(THIS_MODULE);
>  	return 0;
>  
> +fail_nvmem_add:
> +	device_unregister(&mtd->dev);
>  fail_added:
>  	of_node_put(mtd_get_of_node(mtd));
>  	idr_remove(&mtd_idr, i);
> @@ -637,6 +689,10 @@ int del_mtd_device(struct mtd_info *mtd)
>  		       mtd->index, mtd->name, mtd->usecount);
>  		ret = -EBUSY;
>  	} else {
> +		/* Try to remove the NVMEM provider */
> +		if (mtd->nvmem)
> +			nvmem_unregister(mtd->nvmem);
> +
>  		device_unregister(&mtd->dev);
>  
>  		idr_remove(&mtd_idr, mtd->index);
> diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
> index cd0be91bdefa..545070c2ee64 100644
> --- a/include/linux/mtd/mtd.h
> +++ b/include/linux/mtd/mtd.h
> @@ -25,6 +25,7 @@
>  #include <linux/notifier.h>
>  #include <linux/device.h>
>  #include <linux/of.h>
> +#include <linux/nvmem-provider.h>
>  
>  #include <mtd/mtd-abi.h>
>  
> @@ -341,6 +342,7 @@ struct mtd_info {
>  	struct device dev;
>  	int usecount;
>  	struct mtd_debug_info dbg;
> +	struct nvmem_device *nvmem;
>  };
>  
>  int mtd_ooblayout_ecc(struct mtd_info *mtd, int section,

  reply	other threads:[~2018-11-18 16:06 UTC|newest]

Thread overview: 87+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-13 14:01 [PATCH v2 00/25] at24: remove Bartosz Golaszewski
2018-11-13 14:01 ` Bartosz Golaszewski
2018-11-13 14:01 ` [PATCH v2 01/25] nvmem: add new config option Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-29 14:30   ` Bartosz Golaszewski
2018-11-29 14:32     ` Srinivas Kandagatla
2018-11-29 14:35       ` Bartosz Golaszewski
2018-11-29 14:43         ` Boris Brezillon
2018-11-13 14:01 ` [PATCH v2 02/25] mtd: add support for reading MTD devices via the nvmem API Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-18 16:06   ` Boris Brezillon [this message]
2018-11-18 16:06     ` Boris Brezillon
2018-11-18 16:06     ` Boris Brezillon
2018-11-18 16:06     ` Boris Brezillon
2018-11-13 14:01 ` [PATCH v2 03/25] ARM: davinci: dm365-evm: use cell nvmem lookup for mac address Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-13 14:01 ` [PATCH v2 04/25] ARM: davinci: dm644x-evm: " Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-13 14:01 ` [PATCH v2 05/25] ARM: davinci: dm646x-evm: " Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-13 14:01 ` [PATCH v2 06/25] ARM: davinci: da830-evm: " Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-13 14:01 ` [PATCH v2 07/25] ARM: davinci: mityomapl138: " Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-13 14:01 ` [PATCH v2 08/25] ARM: davinci: dm850-evm: " Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-13 14:01 ` [PATCH v2 09/25] ARM: davinci: da850-evm: remove unnecessary include Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-13 14:01 ` [PATCH v2 10/25] net: ethernet: provide nvmem_get_mac_address() Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-29 16:45   ` Bartosz Golaszewski
2018-11-29 19:16     ` David Miller
2018-11-13 14:01 ` [PATCH v2 11/25] net: cadence: switch to using nvmem_get_mac_address() Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-18 15:42   ` Nicolas.Ferre
2018-11-18 15:42     ` Nicolas.Ferre at microchip.com
2018-11-18 15:42     ` Nicolas.Ferre
2018-11-13 14:01 ` [PATCH v2 12/25] of: net: kill of_get_nvmem_mac_address() Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-17 15:45   ` Rob Herring
2018-11-17 15:45     ` Rob Herring
2018-11-17 15:45     ` Rob Herring
2018-11-13 14:01 ` [PATCH v2 13/25] net: davinci_emac: use nvmem_get_mac_address() Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-13 14:01 ` [PATCH v2 14/25] ARM: davinci: da850-evm: remove dead MTD code Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-13 14:01 ` [PATCH v2 15/25] ARM: davinci: mityomapl138: don't read the MAC address from machine code Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-13 14:01 ` [PATCH v2 16/25] ARM: davinci: dm365-evm: use device properties for at24 eeprom Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-13 14:01 ` [PATCH v2 17/25] ARM: davinci: da830-evm: " Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-13 14:01 ` [PATCH v2 18/25] ARM: davinci: dm644x-evm: " Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-13 14:01 ` [PATCH v2 19/25] ARM: davinci: dm646x-evm: " Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-13 14:01 ` [PATCH v2 20/25] ARM: davinci: sffsdr: fix the at24 eeprom device name Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-13 14:01 ` [PATCH v2 21/25] ARM: davinci: sffsdr: use device properties for at24 eeprom Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-13 14:01 ` [PATCH v2 22/25] ARM: davinci: remove dead code related to MAC address reading Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-13 14:01 ` [PATCH v2 23/25] ARM: davinci: mityomapl138: use nvmem notifiers Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-13 14:01 ` [PATCH v2 24/25] ARM: davinci: mityomapl138: use device properties for at24 eeprom Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-13 14:01 ` [PATCH v2 25/25] eeprom: at24: remove at24_platform_data Bartosz Golaszewski
2018-11-13 14:01   ` Bartosz Golaszewski
2018-11-13 14:04 ` [PATCH v2 00/25] at24: remove Bartosz Golaszewski
2018-11-13 14:04   ` Bartosz Golaszewski
2018-11-13 14:07 ` Wolfram Sang
2018-11-13 14:07   ` Wolfram Sang
2018-11-13 14:07   ` Wolfram Sang
2018-11-18 16:03 ` Boris Brezillon
2018-11-18 16:03   ` Boris Brezillon
2018-11-18 16:03   ` Boris Brezillon
2018-11-18 16:03   ` Boris Brezillon
2018-11-19  8:58   ` Bartosz Golaszewski
2018-11-19  8:58     ` Bartosz Golaszewski
2018-11-19  8:58     ` Bartosz Golaszewski
2018-11-19  9:08     ` Boris Brezillon
2018-11-19  9:08       ` Boris Brezillon
2018-11-19  9:08       ` Boris Brezillon
2018-12-06 12:33 ` Sekhar Nori
2018-12-06 12:33   ` Sekhar Nori
2018-12-06 12:33   ` Sekhar Nori

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=20181118170624.33daaaf9@bbrezillon \
    --to=boris.brezillon@bootlin.com \
    --cc=albeu@free.fr \
    --cc=andrew@lunn.ch \
    --cc=arnd@arndb.de \
    --cc=bgolaszewski@baylibre.com \
    --cc=brgl@bgdev.pl \
    --cc=computersforpeace@gmail.com \
    --cc=davem@davemloft.net \
    --cc=devicetree@vger.kernel.org \
    --cc=dwmw2@infradead.org \
    --cc=f.fainelli@gmail.com \
    --cc=frowand.list@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=grygorii.strashko@ti.com \
    --cc=khilman@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=linux@armlinux.org.uk \
    --cc=marek.vasut@gmail.com \
    --cc=netdev@vger.kernel.org \
    --cc=nicolas.ferre@microchip.com \
    --cc=nsekhar@ti.com \
    --cc=richard@nod.at \
    --cc=robh+dt@kernel.org \
    --cc=srinivas.kandagatla@linaro.org \
    --cc=wsa@the-dreams.de \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.