mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Sascha Hauer <s.hauer@pengutronix.de>
To: Oleksij Rempel <o.rempel@pengutronix.de>
Cc: barebox@lists.infradead.org,
	Steffen Trumtrar <s.trumtrar@pengutronix.de>
Subject: Re: [PATCH v1 2/2] nvmem: add simple nvstore driver
Date: Tue, 14 Mar 2017 08:36:53 +0100	[thread overview]
Message-ID: <20170314073653.rgexs6q5wwafl5ys@pengutronix.de> (raw)
In-Reply-To: <20170313102207.30590-3-o.rempel@pengutronix.de>

On Mon, Mar 13, 2017 at 11:22:07AM +0100, Oleksij Rempel wrote:
> From: Steffen Trumtrar <s.trumtrar@pengutronix.de>
> 
> Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
> Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
> ---
>  drivers/nvmem/Kconfig   |   8 +++
>  drivers/nvmem/Makefile  |   4 ++
>  drivers/nvmem/nvstore.c | 142 ++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 154 insertions(+)
>  create mode 100644 drivers/nvmem/nvstore.c
> 
> diff --git a/drivers/nvmem/Kconfig b/drivers/nvmem/Kconfig
> index 218be05b2..23ebc1ea7 100644
> --- a/drivers/nvmem/Kconfig
> +++ b/drivers/nvmem/Kconfig
> @@ -6,3 +6,11 @@ menuconfig NVMEM
>  	  This framework is designed to provide a generic interface to NVMEM
>  
>  	  If unsure, say no.
> +
> +if NVMEM
> +
> +config NVMEM_STORE
> +       tristate "NVMEM storage"
> +       help

What is a nvstore?

> +
> +endif
> diff --git a/drivers/nvmem/Makefile b/drivers/nvmem/Makefile
> index 6df2c6952..34a59c316 100644
> --- a/drivers/nvmem/Makefile
> +++ b/drivers/nvmem/Makefile
> @@ -4,3 +4,7 @@
>  
>  obj-$(CONFIG_NVMEM)		+= nvmem_core.o
>  nvmem_core-y			:= core.o
> +
> +# Devices
> +obj-$(CONFIG_NVMEM_STORE)	+= nvmem_nvstore.o
> +nvmem_nvstore-y			:= nvstore.o
> diff --git a/drivers/nvmem/nvstore.c b/drivers/nvmem/nvstore.c
> new file mode 100644
> index 000000000..c1b256d92
> --- /dev/null
> +++ b/drivers/nvmem/nvstore.c
> @@ -0,0 +1,142 @@
> +/*
> + * Copyright (c) 2015 Pengutronix, Steffen Trumtrar <kernel@pengutronix.de>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2
> + * as published by the Free Software Foundation.
> + *
> + * http://www.opensource.org/licenses/gpl-license.html
> + * http://www.gnu.org/copyleft/gpl.html
> + */
> +#include <common.h>
> +#include <driver.h>
> +#include <init.h>
> +#include <io.h>
> +#include <of.h>
> +#include <malloc.h>
> +#include <linux/nvmem-provider.h>
> +
> +struct nvstore_priv {
> +	struct device_d *dev;
> +	void __iomem	*base;
> +};
> +
> +static int nvstore_write(struct device_d *dev, const int reg, const void *val,
> +			 int val_size)
> +{
> +	struct nvstore_priv *priv = dev->parent->priv;
> +	unsigned int offset;
> +
> +	offset = reg;
> +	while (val_size > 0) {

Here val_size looks like it's the number of words (bytes?) to write.

> +		switch (val_size) {
> +		case 1:
> +			writeb(*(u8 *)val, priv->base + offset);
> +			break;
> +		case 2:
> +			writew(*(u16 *)val, priv->base + offset);
> +			break;
> +		case 4:
> +			writel(*(u32 *)val, priv->base + offset);
> +			break;
> +		}

This instead suggests val_size is the width of a single word.

> +		val_size -= 4;
> +		val += 4;
> +		offset += 4;

And this looks like a word width of 4 bytes is the only supported.

This looks wrong. Same for the read function.

> +
> +static struct nvmem_bus nvstore_nvmem_bus = {
> +	.write = nvstore_write,
> +	.read  = nvstore_read,
> +};
> +
> +static struct nvmem_config nvstore_nvmem_config = {
> +	.name = "nvstore",
> +	.stride = 4,
> +	.word_size = 4,
> +};
> +
> +static int nvstore_probe(struct device_d *dev)
> +{
> +	struct nvstore_priv *priv;
> +	struct nvmem_device *nvmem;
> +	struct resource *res;
> +
> +	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
> +	if (!priv)
> +		return -ENOMEM;
> +
> +	res = dev_get_resource(dev, IORESOURCE_MEM, 0);
> +	if (IS_ERR(res)) {
> +		res = dev_get_resource(dev->parent, IORESOURCE_MEM, 0);
> +		if (IS_ERR(res)) {
> +			free(priv);
> +			return PTR_ERR(res);
> +		}
> +	}
> +
> +	res = request_iomem_region(dev_name(dev), res->start, res->end);
> +	if (IS_ERR(res)) {
> +		free(priv);
> +		return PTR_ERR(res);
> +	}

dev_request_mem_resource() should do instead of
dev_get_resource()/request_iomem_region()

> +
> +	priv->base = (void __iomem *)res->start;
> +
> +	nvstore_nvmem_config.size = 1;
> +	nvstore_nvmem_config.dev = dev;
> +	nvstore_nvmem_config.bus = &nvstore_nvmem_bus;

Gnagna. This is what happens when the initial driver writer decides that
his device is single instance only. Everyone copies the template and now
we find it in a generic driver which clearly is not necessarily single
instance.

> +
> +	nvmem = nvmem_register(&nvstore_nvmem_config);
> +	if (IS_ERR(nvmem)) {
> +		free(priv);
> +		return PTR_ERR(nvmem);
> +	}
> +
> +	dev->priv = priv;

This should be set before nvmem_register() is called.

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

      reply	other threads:[~2017-03-14  7:37 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-13 10:22 [PATCH v1 0/2] upstream nvmem patches Oleksij Rempel
2017-03-13 10:22 ` [PATCH v1 1/2] drivers: add nvmem framework from kernel Oleksij Rempel
2017-03-13 10:22 ` [PATCH v1 2/2] nvmem: add simple nvstore driver Oleksij Rempel
2017-03-14  7:36   ` Sascha Hauer [this message]

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=20170314073653.rgexs6q5wwafl5ys@pengutronix.de \
    --to=s.hauer@pengutronix.de \
    --cc=barebox@lists.infradead.org \
    --cc=o.rempel@pengutronix.de \
    --cc=s.trumtrar@pengutronix.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox