All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jagan Teki <jagannadh.teki@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v5 1/3] mtd, spi: add MTD layer driver
Date: Wed, 22 Apr 2015 16:22:47 +0530	[thread overview]
Message-ID: <CAD6G_RRSc1iekyj0iEaybj4Z+HtynCDvyrad8JMS-H60bjY17Q@mail.gmail.com> (raw)
In-Reply-To: <1429508853-10139-2-git-send-email-hs@denx.de>

On 20 April 2015 at 11:17, Heiko Schocher <hs@denx.de> wrote:
> From: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
>
> add MTD layer driver for spi, original patch from:
> http://git.denx.de/?p=u-boot/u-boot-mips.git;a=commitdiff;h=bb246819cdc90493dd7089eaa51b9e639765cced
>
> changes from Heiko Schocher against this patch:
> - remove compile error if not defining CONFIG_SPI_FLASH_MTD:
>
>   LD      drivers/mtd/spi/built-in.o
> drivers/mtd/spi/sf_probe.o: In function `spi_flash_mtd_unregister':
> /home/hs/abb/imx6/u-boot/drivers/mtd/spi/sf_internal.h:168: multiple definition of `spi_flash_mtd_unregister'
> drivers/mtd/spi/sf_params.o:/home/hs/abb/imx6/u-boot/drivers/mtd/spi/sf_internal.h:168: first defined here
> drivers/mtd/spi/sf_ops.o: In function `spi_flash_mtd_unregister':
> /home/hs/abb/imx6/u-boot/drivers/mtd/spi/sf_internal.h:168: multiple definition of `spi_flash_mtd_unregister'
> drivers/mtd/spi/sf_params.o:/home/hs/abb/imx6/u-boot/drivers/mtd/spi/sf_internal.h:168: first defined here
> make[1]: *** [drivers/mtd/spi/built-in.o] Fehler 1
> make: *** [drivers/mtd/spi] Fehler 2
>
> - add a README entry.
> - add correct writebufsize, to fit with Linux v3.14
>   MTD, UBI/UBIFS sync.
>
> Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
> Signed-off-by: Heiko Schocher <hs@denx.de>
>
> ---
>
> Changes in v2:
> - add comment from Daniel Schwierzeck:
>   fix compile error from original patch with
>   "static inline" rather than "static __maybe_unused"
> Series-changes: 3
> - rebase with d6c1ffc7d23f4fe4ae8c91101861055b8e1501b6
> Series-changes: 4
> - rebased against 385a08a60f042061b004642d6b9bb6cfb794ad5a
> Series-changes: 5
> - no changes
>
>  README                        |   3 ++
>  common/cmd_sf.c               |   7 ++-
>  drivers/mtd/spi/Makefile      |   1 +
>  drivers/mtd/spi/sf_internal.h |  13 ++++++
>  drivers/mtd/spi/sf_mtd.c      | 104 ++++++++++++++++++++++++++++++++++++++++++
>  drivers/mtd/spi/sf_probe.c    |   5 ++
>  6 files changed, 131 insertions(+), 2 deletions(-)
>  create mode 100644 drivers/mtd/spi/sf_mtd.c
>
> diff --git a/README b/README
> index 9b748cc..56dcfd2 100644
> --- a/README
> +++ b/README
> @@ -3077,6 +3077,9 @@ CBFS (Coreboot Filesystem) support
>                 operation will not execute. The only way to exit this
>                 hardware-protected mode is to drive W#/VPP HIGH.
>
> +               CONFIG_SPI_FLASH_MTD
> +               add  MTD translation layer driver.
> +
>  - SystemACE Support:
>                 CONFIG_SYSTEMACE
>
> diff --git a/common/cmd_sf.c b/common/cmd_sf.c
> index 5c788e9..25a59e5 100644
> --- a/common/cmd_sf.c
> +++ b/common/cmd_sf.c
> @@ -132,14 +132,17 @@ static int do_spi_flash_probe(int argc, char * const argv[])
>
>         flash = new->uclass_priv;
>  #else
> +       if (flash)
> +               spi_flash_free(flash);
> +
>         new = spi_flash_probe(bus, cs, speed, mode);
> +       flash = new;
> +

This could be really a another patch - as it's not related to mtd.

>         if (!new) {
>                 printf("Failed to initialize SPI flash at %u:%u\n", bus, cs);
>                 return 1;
>         }
>
> -       if (flash)
> -               spi_flash_free(flash);
>         flash = new;
>  #endif
>
> diff --git a/drivers/mtd/spi/Makefile b/drivers/mtd/spi/Makefile
> index c61b784e..f8580cd 100644
> --- a/drivers/mtd/spi/Makefile
> +++ b/drivers/mtd/spi/Makefile
> @@ -17,5 +17,6 @@ obj-$(CONFIG_SPI_FLASH) += sf_probe.o
>  #endif
>  obj-$(CONFIG_CMD_SF) += sf.o
>  obj-$(CONFIG_SPI_FLASH) += sf_ops.o sf_params.o
> +obj-$(CONFIG_SPI_FLASH_MTD) += sf_mtd.o
>  obj-$(CONFIG_SPI_FLASH_SANDBOX) += sandbox.o
>  obj-$(CONFIG_SPI_M95XXX) += eeprom_m95xxx.o
> diff --git a/drivers/mtd/spi/sf_internal.h b/drivers/mtd/spi/sf_internal.h
> index 785f7a9..dc75f43 100644
> --- a/drivers/mtd/spi/sf_internal.h
> +++ b/drivers/mtd/spi/sf_internal.h
> @@ -221,4 +221,17 @@ int spi_flash_read_common(struct spi_flash *flash, const u8 *cmd,
>  int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset,
>                 size_t len, void *data);
>
> +#ifdef CONFIG_SPI_FLASH_MTD
> +int spi_flash_mtd_register(struct spi_flash *flash);
> +void spi_flash_mtd_unregister(void);
> +#else
> +static inline int spi_flash_mtd_register(struct spi_flash *flash)
> +{
> +       return 0;
> +}
> +static inline void spi_flash_mtd_unregister(void)
> +{
> +}
> +#endif

From the previous comments to reply - https://patchwork.ozlabs.org/patch/386102/

Adding #def isn't a polluting thing in code size contains software's like u-boot
and did the same for many of my code.

So please do as below

#ifdef CONFIG_SPI_FLASH_MTD
  int spi_flash_mtd_register(struct spi_flash *flash);
  void spi_flash_mtd_unregister(void);
#endif

void spi_flash_free(struct spi_flash *flash)
{
#ifdef CONFIG_SPI_FLASH_MTD
    spi_flash_mtd_unregister();
#endif
}

#ifdef CONFIG_SPI_FLASH_MTD
  ret = spi_flash_mtd_register(flash);
  if (ret)
  goto err_claim_bus;
#endif

> +
>  #endif /* _SF_INTERNAL_H_ */
> diff --git a/drivers/mtd/spi/sf_mtd.c b/drivers/mtd/spi/sf_mtd.c
> new file mode 100644
> index 0000000..0b9cb62
> --- /dev/null
> +++ b/drivers/mtd/spi/sf_mtd.c
> @@ -0,0 +1,104 @@
> +/*
> + * Copyright (C) 2012-2014 Daniel Schwierzeck, daniel.schwierzeck at gmail.com
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <malloc.h>
> +#include <asm/errno.h>
> +#include <linux/mtd/mtd.h>
> +#include <spi_flash.h>
> +
> +static struct mtd_info sf_mtd_info;
> +static char sf_mtd_name[8];
> +
> +static int spi_flash_mtd_erase(struct mtd_info *mtd, struct erase_info *instr)
> +{
> +       struct spi_flash *flash = mtd->priv;
> +       int err;
> +
> +       instr->state = MTD_ERASING;
> +
> +       err = spi_flash_erase(flash, instr->addr, instr->len);
> +       if (err) {
> +               instr->state = MTD_ERASE_FAILED;
> +               instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
> +               return -EIO;
> +       }
> +
> +       instr->state = MTD_ERASE_DONE;
> +       mtd_erase_callback(instr);
> +
> +       return 0;
> +}
> +
> +static int spi_flash_mtd_read(struct mtd_info *mtd, loff_t from, size_t len,
> +       size_t *retlen, u_char *buf)
> +{
> +       struct spi_flash *flash = mtd->priv;
> +       int err;
> +
> +       err = spi_flash_read(flash, from, len, buf);
> +       if (!err)
> +               *retlen = len;
> +
> +       return err;
> +}
> +
> +static int spi_flash_mtd_write(struct mtd_info *mtd, loff_t to, size_t len,
> +       size_t *retlen, const u_char *buf)
> +{
> +       struct spi_flash *flash = mtd->priv;
> +       int err;
> +
> +       err = spi_flash_write(flash, to, len, buf);
> +       if (!err)
> +               *retlen = len;
> +
> +       return err;
> +}
> +
> +static void spi_flash_mtd_sync(struct mtd_info *mtd)
> +{
> +}
> +
> +static int spi_flash_mtd_number(void)
> +{
> +#ifdef CONFIG_SYS_MAX_FLASH_BANKS
> +       return CONFIG_SYS_MAX_FLASH_BANKS;
> +#else
> +       return 0;
> +#endif
> +}
> +
> +int spi_flash_mtd_register(struct spi_flash *flash)
> +{
> +       memset(&sf_mtd_info, 0, sizeof(sf_mtd_info));
> +       sprintf(sf_mtd_name, "nor%d", spi_flash_mtd_number());
> +
> +       sf_mtd_info.name = sf_mtd_name;
> +       sf_mtd_info.type = MTD_NORFLASH;
> +       sf_mtd_info.flags = MTD_CAP_NORFLASH;
> +       sf_mtd_info.writesize = 1;
> +       sf_mtd_info.writebufsize = flash->page_size;
> +
> +       sf_mtd_info._erase = spi_flash_mtd_erase;
> +       sf_mtd_info._read = spi_flash_mtd_read;
> +       sf_mtd_info._write = spi_flash_mtd_write;
> +       sf_mtd_info._sync = spi_flash_mtd_sync;
> +
> +       sf_mtd_info.size = flash->size;
> +       sf_mtd_info.priv = flash;
> +
> +       /* Only uniform flash devices for now */
> +       sf_mtd_info.numeraseregions = 0;
> +       sf_mtd_info.erasesize = flash->sector_size;
> +
> +       return add_mtd_device(&sf_mtd_info);
> +}
> +
> +void spi_flash_mtd_unregister(void)
> +{
> +       del_mtd_device(&sf_mtd_info);
> +}
> diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c
> index 4103723..93209fe 100644
> --- a/drivers/mtd/spi/sf_probe.c
> +++ b/drivers/mtd/spi/sf_probe.c
> @@ -399,6 +399,10 @@ int spi_flash_probe_slave(struct spi_slave *spi, struct spi_flash *flash)
>         /* Release spi bus */
>         spi_release_bus(spi);
>
> +       ret = spi_flash_mtd_register(flash);
> +       if (ret)
> +               return ret;

mtd register call is before the spi_release_bus isn't it?

> +
>         return 0;
>
>  err_read_id:
> @@ -449,6 +453,7 @@ struct spi_flash *spi_flash_probe_fdt(const void *blob, int slave_node,
>
>  void spi_flash_free(struct spi_flash *flash)
>  {
> +       spi_flash_mtd_unregister();
>         spi_free_slave(flash->spi);
>         free(flash);
>  }
> --
> 2.1.0
>

thanks!
-- 
Jagan.

  reply	other threads:[~2015-04-22 10:52 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-20  5:47 [U-Boot] [PATCH v5 0/3] spi, sf: add mtdparts feature to spi and sf commands Heiko Schocher
2015-04-20  5:47 ` [U-Boot] [PATCH v5 1/3] mtd, spi: add MTD layer driver Heiko Schocher
2015-04-22 10:52   ` Jagan Teki [this message]
2015-04-23  5:27     ` Heiko Schocher
2015-04-20  5:47 ` [U-Boot] [PATCH v5 2/3] mtd, nand: move common functions from cmd_nand.c to common place Heiko Schocher
2015-04-22 10:53   ` Jagan Teki
2015-04-22 22:47   ` Scott Wood
2015-04-23  5:57     ` Heiko Schocher
2015-04-23  6:55       ` Scott Wood
2015-04-23 11:12         ` Heiko Schocher
2015-04-23 17:48           ` Scott Wood
2015-04-24  4:59             ` Heiko Schocher
2015-04-24  5:25               ` Scott Wood
2015-04-20  5:47 ` [U-Boot] [PATCH v5 3/3] spi, sf: use offset and size in sf cmd from mtdpartition Heiko Schocher
2015-04-22 10:58   ` Jagan Teki
2015-04-23  5:38     ` Heiko Schocher

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=CAD6G_RRSc1iekyj0iEaybj4Z+HtynCDvyrad8JMS-H60bjY17Q@mail.gmail.com \
    --to=jagannadh.teki@gmail.com \
    --cc=u-boot@lists.denx.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.