All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v5 0/3] spi, sf: add mtdparts feature to spi and sf commands
@ 2015-04-20  5:47 Heiko Schocher
  2015-04-20  5:47 ` [U-Boot] [PATCH v5 1/3] mtd, spi: add MTD layer driver Heiko Schocher
                   ` (2 more replies)
  0 siblings, 3 replies; 16+ messages in thread
From: Heiko Schocher @ 2015-04-20  5:47 UTC (permalink / raw)
  To: u-boot

This patchserie add the popssibility to define mtd partitions on
spi nor flash, and use this settings with the sf commands.

steps:

- add MTD layer driver for spi, original patch from:
http://git.denx.de/?p=u-boot/u-boot-mips.git;a=commitdiff;h=bb246819cdc90493dd7089eaa51b9e639765cced

  and addapted it to current mainline.

- move common functions to get offset and size from
  cmdline nand command to extract offset and size from
  a mtd partition to common place "drivers/mtd/mtd_uboot.c"
  maybe another place is better?

- add to the sf command the possibility to use offset and size from
  the settings in mtdparts

With this patchset, the sf command looks now:

=> sf
sf - SPI flash sub-system

Usage:
sf probe [[bus:]cs] [hz] [mode] - init flash device on given SPI bus
                                  and chip select
sf read addr offset|partition len       - read `len' bytes starting at
                                          `offset' to memory at `addr'
sf write addr offset|partition len      - write `len' bytes from memory
                                          at `addr' to flash at `offset'
sf erase offset|partition [+]len        - erase `len' bytes from `offset'
                                          `+len' round up `len' to block size
sf update addr offset|partition len     - erase and write `len' bytes from memory
                                          at `addr' to flash at `offset'
=>
for example "env" is defined in mtdparts:

=> sf read 13000000 env
device 0 offset 0xd0000, size 0x10000
SF: 65536 bytes @ 0xd0000 Read: OK
=>

There are the followings checkpatch warnings:

CHECK: Alignment should match open parenthesis
+               if (arg_off(argv[2], &idx, &addr, &maxsize, &maxsize,
+                   MTD_DEV_TYPE_NAND, nand_info[idx].size)) {

CHECK: Alignment should match open parenthesis
+                       if (arg_off(argv[3], &dev, &off, &size, &maxsize,
+                           MTD_DEV_TYPE_NAND, nand_info[dev].size))

CHECK: Alignment should match open parenthesis
+                       if (arg_off_size(argc - 3, argv + 3, &dev, &off, &size,
+                           &maxsize, MTD_DEV_TYPE_NAND,

total: 0 errors, 0 warnings, 3 checks, 361 lines checked

NOTE: Ignored message types: COMPLEX_MACRO CONSIDER_KSTRTO MINMAX MULTISTATEMENT_MACRO_USE_DO_WHILE NETWORKING_BLOCK_COMMENT_STYLE USLEEP_RANGE

20140714_ml_mtdparts/0002-mtd-nand-move-common-functions-from-cmd_nand.c-to-co.patch has style problems, please review.

I see not, why this warning pops up ...

resend rebased version of this series, as v3 is pending since
September 2014...

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
- none
Series-changes: 3
- add comments from scott wood:
  - align MTD_DEV_TYPE_NAND correct
  - remove unnecessary inline
  - rework "jffs2 header" problem later
- rebase with d6c1ffc7d23f4fe4ae8c91101861055b8e1501b6
Series-changes: 4
- rebased against 385a08a60f042061b004642d6b9bb6cfb794ad5a
Series-changes: 5
- add comment from Scott Wood:
  keep the continuation line aligned with the arguments
- none
Series-changes: 3
- rebase with d6c1ffc7d23f4fe4ae8c91101861055b8e1501b6
Series-changes: 4
- rebased against 385a08a60f042061b004642d6b9bb6cfb794ad5a
Series-changes: 5
- no changes

Daniel Schwierzeck (1):
  mtd, spi: add MTD layer driver

Heiko Schocher (2):
  mtd, nand: move common functions from cmd_nand.c to common place
  spi, sf: use offset and size in sf cmd from mtdpartition

 README                        |   3 +
 common/cmd_nand.c             | 142 ++++++++----------------------------------
 common/cmd_onenand.c          |  19 ++----
 common/cmd_sf.c               |  57 +++++++++--------
 drivers/mtd/Makefile          |   4 +-
 drivers/mtd/mtd_uboot.c       | 114 +++++++++++++++++++++++++++++++++
 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 ++
 include/linux/mtd/mtd.h       |   7 +++
 11 files changed, 312 insertions(+), 157 deletions(-)
 create mode 100644 drivers/mtd/mtd_uboot.c
 create mode 100644 drivers/mtd/spi/sf_mtd.c

-- 
2.1.0

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v5 1/3] mtd, spi: add MTD layer driver
  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 ` Heiko Schocher
  2015-04-22 10:52   ` Jagan Teki
  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-20  5:47 ` [U-Boot] [PATCH v5 3/3] spi, sf: use offset and size in sf cmd from mtdpartition Heiko Schocher
  2 siblings, 1 reply; 16+ messages in thread
From: Heiko Schocher @ 2015-04-20  5:47 UTC (permalink / raw)
  To: u-boot

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;
+
 	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
+
 #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;
+
 	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

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v5 2/3] mtd, nand: move common functions from cmd_nand.c to common place
  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-20  5:47 ` Heiko Schocher
  2015-04-22 10:53   ` Jagan Teki
  2015-04-22 22:47   ` 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
  2 siblings, 2 replies; 16+ messages in thread
From: Heiko Schocher @ 2015-04-20  5:47 UTC (permalink / raw)
  To: u-boot

move common functions from cmd_nand.c (for calculating offset
and size from cmdline paramter) to common place, so they could
used from other commands which use mtd partitions.

For onenand the arg_off_size() is left in common/cmd_onenand.c.
It should use now the common arg_off() function, but as I could
not test onenand I let it there ...

Signed-off-by: Heiko Schocher <hs@denx.de>

---

Changes in v2:
- none
Series-changes: 3
- add comments from scott wood:
  - align MTD_DEV_TYPE_NAND correct
  - remove unnecessary inline
  - rework "jffs2 header" problem later
- rebase with d6c1ffc7d23f4fe4ae8c91101861055b8e1501b6
Series-changes: 4
- rebased against 385a08a60f042061b004642d6b9bb6cfb794ad5a
Series-changes: 5
- add comment from Scott Wood:
  keep the continuation line aligned with the arguments

 common/cmd_nand.c       | 142 +++++++++---------------------------------------
 common/cmd_onenand.c    |  19 ++-----
 drivers/mtd/Makefile    |   4 +-
 drivers/mtd/mtd_uboot.c | 114 ++++++++++++++++++++++++++++++++++++++
 include/linux/mtd/mtd.h |   7 +++
 5 files changed, 156 insertions(+), 130 deletions(-)
 create mode 100644 drivers/mtd/mtd_uboot.c

diff --git a/common/cmd_nand.c b/common/cmd_nand.c
index 17fa7ea..184335d 100644
--- a/common/cmd_nand.c
+++ b/common/cmd_nand.c
@@ -133,115 +133,6 @@ static int set_dev(int dev)
 	return 0;
 }
 
-static inline int str2off(const char *p, loff_t *num)
-{
-	char *endptr;
-
-	*num = simple_strtoull(p, &endptr, 16);
-	return *p != '\0' && *endptr == '\0';
-}
-
-static inline int str2long(const char *p, ulong *num)
-{
-	char *endptr;
-
-	*num = simple_strtoul(p, &endptr, 16);
-	return *p != '\0' && *endptr == '\0';
-}
-
-static int get_part(const char *partname, int *idx, loff_t *off, loff_t *size,
-		loff_t *maxsize)
-{
-#ifdef CONFIG_CMD_MTDPARTS
-	struct mtd_device *dev;
-	struct part_info *part;
-	u8 pnum;
-	int ret;
-
-	ret = mtdparts_init();
-	if (ret)
-		return ret;
-
-	ret = find_dev_and_part(partname, &dev, &pnum, &part);
-	if (ret)
-		return ret;
-
-	if (dev->id->type != MTD_DEV_TYPE_NAND) {
-		puts("not a NAND device\n");
-		return -1;
-	}
-
-	*off = part->offset;
-	*size = part->size;
-	*maxsize = part->size;
-	*idx = dev->id->num;
-
-	ret = set_dev(*idx);
-	if (ret)
-		return ret;
-
-	return 0;
-#else
-	puts("offset is not a number\n");
-	return -1;
-#endif
-}
-
-static int arg_off(const char *arg, int *idx, loff_t *off, loff_t *size,
-		loff_t *maxsize)
-{
-	if (!str2off(arg, off))
-		return get_part(arg, idx, off, size, maxsize);
-
-	if (*off >= nand_info[*idx].size) {
-		puts("Offset exceeds device limit\n");
-		return -1;
-	}
-
-	*maxsize = nand_info[*idx].size - *off;
-	*size = *maxsize;
-	return 0;
-}
-
-static int arg_off_size(int argc, char *const argv[], int *idx,
-			loff_t *off, loff_t *size, loff_t *maxsize)
-{
-	int ret;
-
-	if (argc == 0) {
-		*off = 0;
-		*size = nand_info[*idx].size;
-		*maxsize = *size;
-		goto print;
-	}
-
-	ret = arg_off(argv[0], idx, off, size, maxsize);
-	if (ret)
-		return ret;
-
-	if (argc == 1)
-		goto print;
-
-	if (!str2off(argv[1], size)) {
-		printf("'%s' is not a number\n", argv[1]);
-		return -1;
-	}
-
-	if (*size > *maxsize) {
-		puts("Size exceeds partition or device limit\n");
-		return -1;
-	}
-
-print:
-	printf("device %d ", *idx);
-	if (*size == nand_info[*idx].size)
-		puts("whole chip\n");
-	else
-		printf("offset 0x%llx, size 0x%llx\n",
-		       (unsigned long long)*off, (unsigned long long)*size);
-	return 0;
-}
-
 #ifdef CONFIG_CMD_NAND_LOCK_UNLOCK
 static void print_status(ulong start, ulong end, ulong erasesize, int status)
 {
@@ -322,7 +213,12 @@ int do_nand_env_oob(cmd_tbl_t *cmdtp, int argc, char *const argv[])
 			goto usage;
 
 		/* We don't care about size, or maxsize. */
-		if (arg_off(argv[2], &idx, &addr, &maxsize, &maxsize)) {
+		if (arg_off(argv[2], &idx, &addr, &maxsize, &maxsize,
+			    MTD_DEV_TYPE_NAND, nand_info[idx].size)) {
+				puts("Offset or partition name expected\n");
+				return 1;
+		}
+		if (set_dev(idx)) {
 			puts("Offset or partition name expected\n");
 			return 1;
 		}
@@ -595,7 +491,11 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 		printf("\nNAND %s: ", cmd);
 		/* skip first two or three arguments, look for offset and size */
 		if (arg_off_size(argc - o, argv + o, &dev, &off, &size,
-				 &maxsize) != 0)
+				 &maxsize, MTD_DEV_TYPE_NAND,
+				 nand_info[dev].size) != 0)
+			return 1;
+
+		if (set_dev(dev))
 			return 1;
 
 		nand = &nand_info[dev];
@@ -655,7 +555,11 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 		if (s && !strcmp(s, ".raw")) {
 			raw = 1;
 
-			if (arg_off(argv[3], &dev, &off, &size, &maxsize))
+			if (arg_off(argv[3], &dev, &off, &size, &maxsize,
+				    MTD_DEV_TYPE_NAND, nand_info[dev].size))
+				return 1;
+
+			if (set_dev(dev))
 				return 1;
 
 			nand = &nand_info[dev];
@@ -672,8 +576,12 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
 			rwsize = pagecount * (nand->writesize + nand->oobsize);
 		} else {
-			if (arg_off_size(argc - 3, argv + 3, &dev,
-						&off, &size, &maxsize) != 0)
+			if (arg_off_size(argc - 3, argv + 3, &dev, &off, &size,
+					 &maxsize, MTD_DEV_TYPE_NAND,
+					 nand_info[dev].size) != 0)
+				return 1;
+
+			if (set_dev(dev))
 				return 1;
 
 			/* size is unspecified */
@@ -812,7 +720,11 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 			allexcept = 1;
 
 		if (arg_off_size(argc - 2, argv + 2, &dev, &off, &size,
-				 &maxsize) < 0)
+				 &maxsize, MTD_DEV_TYPE_NAND,
+				 nand_info[dev].size) < 0)
+			return 1;
+
+		if (set_dev(dev))
 			return 1;
 
 		if (!nand_unlock(&nand_info[dev], off, size, allexcept)) {
diff --git a/common/cmd_onenand.c b/common/cmd_onenand.c
index 06cc140..feab01a 100644
--- a/common/cmd_onenand.c
+++ b/common/cmd_onenand.c
@@ -24,15 +24,8 @@ static struct mtd_info *mtd;
 static loff_t next_ofs;
 static loff_t skip_ofs;
 
-static inline int str2long(char *p, ulong *num)
-{
-	char *endptr;
-
-	*num = simple_strtoul(p, &endptr, 16);
-	return (*p != '\0' && *endptr == '\0') ? 1 : 0;
-}
-
-static int arg_off_size(int argc, char * const argv[], ulong *off, size_t *size)
+static int arg_off_size_onenand(int argc, char * const argv[], ulong *off,
+				size_t *size)
 {
 	if (argc >= 1) {
 		if (!(str2long(argv[0], off))) {
@@ -399,7 +392,7 @@ static int do_onenand_read(cmd_tbl_t * cmdtp, int flag, int argc, char * const a
 	addr = (ulong)simple_strtoul(argv[1], NULL, 16);
 
 	printf("\nOneNAND read: ");
-	if (arg_off_size(argc - 2, argv + 2, &ofs, &len) != 0)
+	if (arg_off_size_onenand(argc - 2, argv + 2, &ofs, &len) != 0)
 		return 1;
 
 	ret = onenand_block_read(ofs, len, &retlen, (u8 *)addr, oob);
@@ -425,7 +418,7 @@ static int do_onenand_write(cmd_tbl_t * cmdtp, int flag, int argc, char * const
 	addr = (ulong)simple_strtoul(argv[1], NULL, 16);
 
 	printf("\nOneNAND write: ");
-	if (arg_off_size(argc - 2, argv + 2, &ofs, &len) != 0)
+	if (arg_off_size_onenand(argc - 2, argv + 2, &ofs, &len) != 0)
 		return 1;
 
 	ret = onenand_block_write(ofs, len, &retlen, (u8 *)addr, withoob);
@@ -461,7 +454,7 @@ static int do_onenand_erase(cmd_tbl_t * cmdtp, int flag, int argc, char * const
 	printf("\nOneNAND erase: ");
 
 	/* skip first two or three arguments, look for offset and size */
-	if (arg_off_size(argc, argv, &ofs, &len) != 0)
+	if (arg_off_size_onenand(argc, argv, &ofs, &len) != 0)
 		return 1;
 
 	ret = onenand_block_erase(ofs, len, force);
@@ -486,7 +479,7 @@ static int do_onenand_test(cmd_tbl_t * cmdtp, int flag, int argc, char * const a
 	printf("\nOneNAND test: ");
 
 	/* skip first two or three arguments, look for offset and size */
-	if (arg_off_size(argc - 1, argv + 1, &ofs, &len) != 0)
+	if (arg_off_size_onenand(argc - 1, argv + 1, &ofs, &len) != 0)
 		return 1;
 
 	ret = onenand_block_test(ofs, len);
diff --git a/drivers/mtd/Makefile b/drivers/mtd/Makefile
index 5467a951..a623f4c 100644
--- a/drivers/mtd/Makefile
+++ b/drivers/mtd/Makefile
@@ -5,8 +5,8 @@
 # SPDX-License-Identifier:	GPL-2.0+
 #
 
-ifneq (,$(findstring y,$(CONFIG_MTD_DEVICE)$(CONFIG_CMD_NAND)$(CONFIG_CMD_ONENAND)))
-obj-y += mtdcore.o
+ifneq (,$(findstring y,$(CONFIG_MTD_DEVICE)$(CONFIG_CMD_NAND)$(CONFIG_CMD_ONENAND)$(CONFIG_CMD_SF)))
+obj-y += mtdcore.o mtd_uboot.o
 endif
 obj-$(CONFIG_MTD_PARTITIONS) += mtdpart.o
 obj-$(CONFIG_MTD_CONCAT) += mtdconcat.o
diff --git a/drivers/mtd/mtd_uboot.c b/drivers/mtd/mtd_uboot.c
new file mode 100644
index 0000000..a70d40a
--- /dev/null
+++ b/drivers/mtd/mtd_uboot.c
@@ -0,0 +1,114 @@
+/*
+ * (C) Copyright 2014
+ * Heiko Schocher, DENX Software Engineering, hs at denx.de.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+#include <common.h>
+#include <linux/mtd/mtd.h>
+#include <jffs2/jffs2.h>
+
+int str2off(const char *p, loff_t *num)
+{
+	char *endptr;
+
+	*num = simple_strtoull(p, &endptr, 16);
+	return *p != '\0' && *endptr == '\0';
+}
+
+int str2long(const char *p, ulong *num)
+{
+	char *endptr;
+
+	*num = simple_strtoul(p, &endptr, 16);
+	return *p != '\0' && *endptr == '\0';
+}
+
+static int get_part(const char *partname, int *idx, loff_t *off, loff_t *size,
+		loff_t *maxsize, int devtype)
+{
+#ifdef CONFIG_CMD_MTDPARTS
+	struct mtd_device *dev;
+	struct part_info *part;
+	u8 pnum;
+	int ret;
+
+	ret = mtdparts_init();
+	if (ret)
+		return ret;
+
+	ret = find_dev_and_part(partname, &dev, &pnum, &part);
+	if (ret)
+		return ret;
+
+	if (dev->id->type != devtype) {
+		printf("not same typ %d != %d\n", dev->id->type, devtype);
+		return -1;
+	}
+
+	*off = part->offset;
+	*size = part->size;
+	*maxsize = part->size;
+	*idx = dev->id->num;
+
+	return 0;
+#else
+	puts("offset is not a number\n");
+	return -1;
+#endif
+}
+
+int arg_off(const char *arg, int *idx, loff_t *off, loff_t *size,
+		loff_t *maxsize, int devtype, int chipsize)
+{
+	if (!str2off(arg, off))
+		return get_part(arg, idx, off, size, maxsize, devtype);
+
+	if (*off >= chipsize) {
+		puts("Offset exceeds device limit\n");
+		return -1;
+	}
+
+	*maxsize = chipsize - *off;
+	*size = *maxsize;
+	return 0;
+}
+
+int arg_off_size(int argc, char *const argv[], int *idx, loff_t *off,
+		 loff_t *size, loff_t *maxsize, int devtype, int chipsize)
+{
+	int ret;
+
+	if (argc == 0) {
+		*off = 0;
+		*size = chipsize;
+		*maxsize = *size;
+		goto print;
+	}
+
+	ret = arg_off(argv[0], idx, off, size, maxsize, devtype, chipsize);
+	if (ret)
+		return ret;
+
+	if (argc == 1)
+		goto print;
+
+	if (!str2off(argv[1], size)) {
+		printf("'%s' is not a number\n", argv[1]);
+		return -1;
+	}
+
+	if (*size > *maxsize) {
+		puts("Size exceeds partition or device limit\n");
+		return -1;
+	}
+
+print:
+	printf("device %d ", *idx);
+	if (*size == chipsize)
+		puts("whole chip\n");
+	else
+		printf("offset 0x%llx, size 0x%llx\n",
+		       (unsigned long long)*off, (unsigned long long)*size);
+	return 0;
+}
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
index 8666413..2861af5 100644
--- a/include/linux/mtd/mtd.h
+++ b/include/linux/mtd/mtd.h
@@ -482,5 +482,12 @@ int add_mtd_device(struct mtd_info *mtd);
 int del_mtd_device(struct mtd_info *mtd);
 int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int);
 int del_mtd_partitions(struct mtd_info *);
+
+int str2off(const char *p, loff_t *num);
+int str2long(const char *p, ulong *num);
+int arg_off(const char *arg, int *idx, loff_t *off, loff_t *size,
+		loff_t *maxsize, int devtype, int chipsize);
+int arg_off_size(int argc, char *const argv[], int *idx, loff_t *off,
+		 loff_t *size, loff_t *maxsize, int devtype, int chipsize);
 #endif
 #endif /* __MTD_MTD_H__ */
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v5 3/3] spi, sf: use offset and size in sf cmd from mtdpartition
  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-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-20  5:47 ` Heiko Schocher
  2015-04-22 10:58   ` Jagan Teki
  2 siblings, 1 reply; 16+ messages in thread
From: Heiko Schocher @ 2015-04-20  5:47 UTC (permalink / raw)
  To: u-boot

with this patch, it is possible to get the offset and size information
from the mtdpartiton setting in "mtdparts", similiar to the
"nand" commandos.

=> sf
sf - SPI flash sub-system

Usage:
sf probe [[bus:]cs] [hz] [mode] - init flash device on given SPI bus
                                  and chip select
sf read addr offset|partition len       - read `len' bytes starting at
                                          `offset' to memory at `addr'
sf write addr offset|partition len      - write `len' bytes from memory
                                          at `addr' to flash at `offset'
sf erase offset|partition [+]len        - erase `len' bytes from `offset'
                                          `+len' round up `len' to block size
sf update addr offset|partition len     - erase and write `len' bytes from memory
                                          at `addr' to flash at `offset'
=>
for example "env" is defined in mtdparts:

=> sf read 13000000 env
device 0 offset 0xd0000, size 0x10000
SF: 65536 bytes @ 0xd0000 Read: OK
=>

Signed-off-by: Heiko Schocher <hs@denx.de>

---

Changes in v2:
- none
Series-changes: 3
- rebase with d6c1ffc7d23f4fe4ae8c91101861055b8e1501b6
Series-changes: 4
- rebased against 385a08a60f042061b004642d6b9bb6cfb794ad5a
Series-changes: 5
- no changes

 common/cmd_sf.c | 50 +++++++++++++++++++++++++-------------------------
 1 file changed, 25 insertions(+), 25 deletions(-)

diff --git a/common/cmd_sf.c b/common/cmd_sf.c
index 25a59e5..1932ac9 100644
--- a/common/cmd_sf.c
+++ b/common/cmd_sf.c
@@ -12,6 +12,8 @@
 #include <malloc.h>
 #include <spi.h>
 #include <spi_flash.h>
+#include <jffs2/jffs2.h>
+#include <linux/mtd/mtd.h>
 
 #include <asm/io.h>
 #include <dm/device-internal.h>
@@ -258,23 +260,21 @@ static int spi_flash_update(struct spi_flash *flash, u32 offset,
 static int do_spi_flash_read_write(int argc, char * const argv[])
 {
 	unsigned long addr;
-	unsigned long offset;
-	unsigned long len;
 	void *buf;
 	char *endp;
 	int ret = 1;
+	int dev = 0;
+	loff_t offset, len, maxsize;
 
-	if (argc < 4)
+	if (argc < 3)
 		return -1;
 
 	addr = simple_strtoul(argv[1], &endp, 16);
 	if (*argv[1] == 0 || *endp != 0)
 		return -1;
-	offset = simple_strtoul(argv[2], &endp, 16);
-	if (*argv[2] == 0 || *endp != 0)
-		return -1;
-	len = simple_strtoul(argv[3], &endp, 16);
-	if (*argv[3] == 0 || *endp != 0)
+
+	if (arg_off_size(argc - 2, &argv[2], &dev, &offset, &len, &maxsize,
+	    MTD_DEV_TYPE_NOR, flash->size))
 		return -1;
 
 	/* Consistency checking */
@@ -313,31 +313,31 @@ static int do_spi_flash_read_write(int argc, char * const argv[])
 
 static int do_spi_flash_erase(int argc, char * const argv[])
 {
-	unsigned long offset;
-	unsigned long len;
-	char *endp;
 	int ret;
+	int dev = 0;
+	loff_t offset, len, maxsize;
+	ulong size;
 
 	if (argc < 3)
 		return -1;
 
-	offset = simple_strtoul(argv[1], &endp, 16);
-	if (*argv[1] == 0 || *endp != 0)
+	if (arg_off(argv[1], &dev, &offset, &len, &maxsize,
+	    MTD_DEV_TYPE_NOR, flash->size))
 		return -1;
 
-	ret = sf_parse_len_arg(argv[2], &len);
+	ret = sf_parse_len_arg(argv[2], &size);
 	if (ret != 1)
 		return -1;
 
 	/* Consistency checking */
-	if (offset + len > flash->size) {
+	if (offset + size > flash->size) {
 		printf("ERROR: attempting %s past flash size (%#x)\n",
 		       argv[0], flash->size);
 		return 1;
 	}
 
-	ret = spi_flash_erase(flash, offset, len);
-	printf("SF: %zu bytes @ %#x Erased: %s\n", (size_t)len, (u32)offset,
+	ret = spi_flash_erase(flash, offset, size);
+	printf("SF: %zu bytes @ %#x Erased: %s\n", (size_t)size, (u32)offset,
 	       ret ? "ERROR" : "OK");
 
 	return ret == 0 ? 0 : 1;
@@ -562,13 +562,13 @@ U_BOOT_CMD(
 	"SPI flash sub-system",
 	"probe [[bus:]cs] [hz] [mode]	- init flash device on given SPI bus\n"
 	"				  and chip select\n"
-	"sf read addr offset len	- read `len' bytes starting at\n"
-	"				  `offset' to memory at `addr'\n"
-	"sf write addr offset len	- write `len' bytes from memory\n"
-	"				  at `addr' to flash at `offset'\n"
-	"sf erase offset [+]len		- erase `len' bytes from `offset'\n"
-	"				  `+len' round up `len' to block size\n"
-	"sf update addr offset len	- erase and write `len' bytes from memory\n"
-	"				  at `addr' to flash at `offset'"
+	"sf read addr offset|partition len	- read `len' bytes starting at\n"
+	"				          `offset' to memory at `addr'\n"
+	"sf write addr offset|partition len	- write `len' bytes from memory\n"
+	"				          at `addr' to flash at `offset'\n"
+	"sf erase offset|partition [+]len	- erase `len' bytes from `offset'\n"
+	"					 `+len' round up `len' to block size\n"
+	"sf update addr offset|partition len	- erase and write `len' bytes from memory\n"
+	"				          at `addr' to flash at `offset'"
 	SF_TEST_HELP
 );
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v5 1/3] mtd, spi: add MTD layer driver
  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
  2015-04-23  5:27     ` Heiko Schocher
  0 siblings, 1 reply; 16+ messages in thread
From: Jagan Teki @ 2015-04-22 10:52 UTC (permalink / raw)
  To: u-boot

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.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v5 2/3] mtd, nand: move common functions from cmd_nand.c to common place
  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
  1 sibling, 0 replies; 16+ messages in thread
From: Jagan Teki @ 2015-04-22 10:53 UTC (permalink / raw)
  To: u-boot

On 20 April 2015 at 11:17, Heiko Schocher <hs@denx.de> wrote:
> move common functions from cmd_nand.c (for calculating offset
> and size from cmdline paramter) to common place, so they could
> used from other commands which use mtd partitions.
>
> For onenand the arg_off_size() is left in common/cmd_onenand.c.
> It should use now the common arg_off() function, but as I could
> not test onenand I let it there ...
>
> Signed-off-by: Heiko Schocher <hs@denx.de>

Reviewed-by: Jagannadha Sutradharudu Teki <jagannadh.teki@gmail.com>

>
> ---
>
> Changes in v2:
> - none
> Series-changes: 3
> - add comments from scott wood:
>   - align MTD_DEV_TYPE_NAND correct
>   - remove unnecessary inline
>   - rework "jffs2 header" problem later
> - rebase with d6c1ffc7d23f4fe4ae8c91101861055b8e1501b6
> Series-changes: 4
> - rebased against 385a08a60f042061b004642d6b9bb6cfb794ad5a
> Series-changes: 5
> - add comment from Scott Wood:
>   keep the continuation line aligned with the arguments
>
>  common/cmd_nand.c       | 142 +++++++++---------------------------------------
>  common/cmd_onenand.c    |  19 ++-----
>  drivers/mtd/Makefile    |   4 +-
>  drivers/mtd/mtd_uboot.c | 114 ++++++++++++++++++++++++++++++++++++++
>  include/linux/mtd/mtd.h |   7 +++
>  5 files changed, 156 insertions(+), 130 deletions(-)
>  create mode 100644 drivers/mtd/mtd_uboot.c
>
> diff --git a/common/cmd_nand.c b/common/cmd_nand.c
> index 17fa7ea..184335d 100644
> --- a/common/cmd_nand.c
> +++ b/common/cmd_nand.c
> @@ -133,115 +133,6 @@ static int set_dev(int dev)
>         return 0;
>  }
>
> -static inline int str2off(const char *p, loff_t *num)
> -{
> -       char *endptr;
> -
> -       *num = simple_strtoull(p, &endptr, 16);
> -       return *p != '\0' && *endptr == '\0';
> -}
> -
> -static inline int str2long(const char *p, ulong *num)
> -{
> -       char *endptr;
> -
> -       *num = simple_strtoul(p, &endptr, 16);
> -       return *p != '\0' && *endptr == '\0';
> -}
> -
> -static int get_part(const char *partname, int *idx, loff_t *off, loff_t *size,
> -               loff_t *maxsize)
> -{
> -#ifdef CONFIG_CMD_MTDPARTS
> -       struct mtd_device *dev;
> -       struct part_info *part;
> -       u8 pnum;
> -       int ret;
> -
> -       ret = mtdparts_init();
> -       if (ret)
> -               return ret;
> -
> -       ret = find_dev_and_part(partname, &dev, &pnum, &part);
> -       if (ret)
> -               return ret;
> -
> -       if (dev->id->type != MTD_DEV_TYPE_NAND) {
> -               puts("not a NAND device\n");
> -               return -1;
> -       }
> -
> -       *off = part->offset;
> -       *size = part->size;
> -       *maxsize = part->size;
> -       *idx = dev->id->num;
> -
> -       ret = set_dev(*idx);
> -       if (ret)
> -               return ret;
> -
> -       return 0;
> -#else
> -       puts("offset is not a number\n");
> -       return -1;
> -#endif
> -}
> -
> -static int arg_off(const char *arg, int *idx, loff_t *off, loff_t *size,
> -               loff_t *maxsize)
> -{
> -       if (!str2off(arg, off))
> -               return get_part(arg, idx, off, size, maxsize);
> -
> -       if (*off >= nand_info[*idx].size) {
> -               puts("Offset exceeds device limit\n");
> -               return -1;
> -       }
> -
> -       *maxsize = nand_info[*idx].size - *off;
> -       *size = *maxsize;
> -       return 0;
> -}
> -
> -static int arg_off_size(int argc, char *const argv[], int *idx,
> -                       loff_t *off, loff_t *size, loff_t *maxsize)
> -{
> -       int ret;
> -
> -       if (argc == 0) {
> -               *off = 0;
> -               *size = nand_info[*idx].size;
> -               *maxsize = *size;
> -               goto print;
> -       }
> -
> -       ret = arg_off(argv[0], idx, off, size, maxsize);
> -       if (ret)
> -               return ret;
> -
> -       if (argc == 1)
> -               goto print;
> -
> -       if (!str2off(argv[1], size)) {
> -               printf("'%s' is not a number\n", argv[1]);
> -               return -1;
> -       }
> -
> -       if (*size > *maxsize) {
> -               puts("Size exceeds partition or device limit\n");
> -               return -1;
> -       }
> -
> -print:
> -       printf("device %d ", *idx);
> -       if (*size == nand_info[*idx].size)
> -               puts("whole chip\n");
> -       else
> -               printf("offset 0x%llx, size 0x%llx\n",
> -                      (unsigned long long)*off, (unsigned long long)*size);
> -       return 0;
> -}
> -
>  #ifdef CONFIG_CMD_NAND_LOCK_UNLOCK
>  static void print_status(ulong start, ulong end, ulong erasesize, int status)
>  {
> @@ -322,7 +213,12 @@ int do_nand_env_oob(cmd_tbl_t *cmdtp, int argc, char *const argv[])
>                         goto usage;
>
>                 /* We don't care about size, or maxsize. */
> -               if (arg_off(argv[2], &idx, &addr, &maxsize, &maxsize)) {
> +               if (arg_off(argv[2], &idx, &addr, &maxsize, &maxsize,
> +                           MTD_DEV_TYPE_NAND, nand_info[idx].size)) {
> +                               puts("Offset or partition name expected\n");
> +                               return 1;
> +               }
> +               if (set_dev(idx)) {
>                         puts("Offset or partition name expected\n");
>                         return 1;
>                 }
> @@ -595,7 +491,11 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>                 printf("\nNAND %s: ", cmd);
>                 /* skip first two or three arguments, look for offset and size */
>                 if (arg_off_size(argc - o, argv + o, &dev, &off, &size,
> -                                &maxsize) != 0)
> +                                &maxsize, MTD_DEV_TYPE_NAND,
> +                                nand_info[dev].size) != 0)
> +                       return 1;
> +
> +               if (set_dev(dev))
>                         return 1;
>
>                 nand = &nand_info[dev];
> @@ -655,7 +555,11 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>                 if (s && !strcmp(s, ".raw")) {
>                         raw = 1;
>
> -                       if (arg_off(argv[3], &dev, &off, &size, &maxsize))
> +                       if (arg_off(argv[3], &dev, &off, &size, &maxsize,
> +                                   MTD_DEV_TYPE_NAND, nand_info[dev].size))
> +                               return 1;
> +
> +                       if (set_dev(dev))
>                                 return 1;
>
>                         nand = &nand_info[dev];
> @@ -672,8 +576,12 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>
>                         rwsize = pagecount * (nand->writesize + nand->oobsize);
>                 } else {
> -                       if (arg_off_size(argc - 3, argv + 3, &dev,
> -                                               &off, &size, &maxsize) != 0)
> +                       if (arg_off_size(argc - 3, argv + 3, &dev, &off, &size,
> +                                        &maxsize, MTD_DEV_TYPE_NAND,
> +                                        nand_info[dev].size) != 0)
> +                               return 1;
> +
> +                       if (set_dev(dev))
>                                 return 1;
>
>                         /* size is unspecified */
> @@ -812,7 +720,11 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>                         allexcept = 1;
>
>                 if (arg_off_size(argc - 2, argv + 2, &dev, &off, &size,
> -                                &maxsize) < 0)
> +                                &maxsize, MTD_DEV_TYPE_NAND,
> +                                nand_info[dev].size) < 0)
> +                       return 1;
> +
> +               if (set_dev(dev))
>                         return 1;
>
>                 if (!nand_unlock(&nand_info[dev], off, size, allexcept)) {
> diff --git a/common/cmd_onenand.c b/common/cmd_onenand.c
> index 06cc140..feab01a 100644
> --- a/common/cmd_onenand.c
> +++ b/common/cmd_onenand.c
> @@ -24,15 +24,8 @@ static struct mtd_info *mtd;
>  static loff_t next_ofs;
>  static loff_t skip_ofs;
>
> -static inline int str2long(char *p, ulong *num)
> -{
> -       char *endptr;
> -
> -       *num = simple_strtoul(p, &endptr, 16);
> -       return (*p != '\0' && *endptr == '\0') ? 1 : 0;
> -}
> -
> -static int arg_off_size(int argc, char * const argv[], ulong *off, size_t *size)
> +static int arg_off_size_onenand(int argc, char * const argv[], ulong *off,
> +                               size_t *size)
>  {
>         if (argc >= 1) {
>                 if (!(str2long(argv[0], off))) {
> @@ -399,7 +392,7 @@ static int do_onenand_read(cmd_tbl_t * cmdtp, int flag, int argc, char * const a
>         addr = (ulong)simple_strtoul(argv[1], NULL, 16);
>
>         printf("\nOneNAND read: ");
> -       if (arg_off_size(argc - 2, argv + 2, &ofs, &len) != 0)
> +       if (arg_off_size_onenand(argc - 2, argv + 2, &ofs, &len) != 0)
>                 return 1;
>
>         ret = onenand_block_read(ofs, len, &retlen, (u8 *)addr, oob);
> @@ -425,7 +418,7 @@ static int do_onenand_write(cmd_tbl_t * cmdtp, int flag, int argc, char * const
>         addr = (ulong)simple_strtoul(argv[1], NULL, 16);
>
>         printf("\nOneNAND write: ");
> -       if (arg_off_size(argc - 2, argv + 2, &ofs, &len) != 0)
> +       if (arg_off_size_onenand(argc - 2, argv + 2, &ofs, &len) != 0)
>                 return 1;
>
>         ret = onenand_block_write(ofs, len, &retlen, (u8 *)addr, withoob);
> @@ -461,7 +454,7 @@ static int do_onenand_erase(cmd_tbl_t * cmdtp, int flag, int argc, char * const
>         printf("\nOneNAND erase: ");
>
>         /* skip first two or three arguments, look for offset and size */
> -       if (arg_off_size(argc, argv, &ofs, &len) != 0)
> +       if (arg_off_size_onenand(argc, argv, &ofs, &len) != 0)
>                 return 1;
>
>         ret = onenand_block_erase(ofs, len, force);
> @@ -486,7 +479,7 @@ static int do_onenand_test(cmd_tbl_t * cmdtp, int flag, int argc, char * const a
>         printf("\nOneNAND test: ");
>
>         /* skip first two or three arguments, look for offset and size */
> -       if (arg_off_size(argc - 1, argv + 1, &ofs, &len) != 0)
> +       if (arg_off_size_onenand(argc - 1, argv + 1, &ofs, &len) != 0)
>                 return 1;
>
>         ret = onenand_block_test(ofs, len);
> diff --git a/drivers/mtd/Makefile b/drivers/mtd/Makefile
> index 5467a951..a623f4c 100644
> --- a/drivers/mtd/Makefile
> +++ b/drivers/mtd/Makefile
> @@ -5,8 +5,8 @@
>  # SPDX-License-Identifier:     GPL-2.0+
>  #
>
> -ifneq (,$(findstring y,$(CONFIG_MTD_DEVICE)$(CONFIG_CMD_NAND)$(CONFIG_CMD_ONENAND)))
> -obj-y += mtdcore.o
> +ifneq (,$(findstring y,$(CONFIG_MTD_DEVICE)$(CONFIG_CMD_NAND)$(CONFIG_CMD_ONENAND)$(CONFIG_CMD_SF)))
> +obj-y += mtdcore.o mtd_uboot.o
>  endif
>  obj-$(CONFIG_MTD_PARTITIONS) += mtdpart.o
>  obj-$(CONFIG_MTD_CONCAT) += mtdconcat.o
> diff --git a/drivers/mtd/mtd_uboot.c b/drivers/mtd/mtd_uboot.c
> new file mode 100644
> index 0000000..a70d40a
> --- /dev/null
> +++ b/drivers/mtd/mtd_uboot.c
> @@ -0,0 +1,114 @@
> +/*
> + * (C) Copyright 2014
> + * Heiko Schocher, DENX Software Engineering, hs at denx.de.
> + *
> + * SPDX-License-Identifier:    GPL-2.0+
> + */
> +#include <common.h>
> +#include <linux/mtd/mtd.h>
> +#include <jffs2/jffs2.h>
> +
> +int str2off(const char *p, loff_t *num)
> +{
> +       char *endptr;
> +
> +       *num = simple_strtoull(p, &endptr, 16);
> +       return *p != '\0' && *endptr == '\0';
> +}
> +
> +int str2long(const char *p, ulong *num)
> +{
> +       char *endptr;
> +
> +       *num = simple_strtoul(p, &endptr, 16);
> +       return *p != '\0' && *endptr == '\0';
> +}
> +
> +static int get_part(const char *partname, int *idx, loff_t *off, loff_t *size,
> +               loff_t *maxsize, int devtype)
> +{
> +#ifdef CONFIG_CMD_MTDPARTS
> +       struct mtd_device *dev;
> +       struct part_info *part;
> +       u8 pnum;
> +       int ret;
> +
> +       ret = mtdparts_init();
> +       if (ret)
> +               return ret;
> +
> +       ret = find_dev_and_part(partname, &dev, &pnum, &part);
> +       if (ret)
> +               return ret;
> +
> +       if (dev->id->type != devtype) {
> +               printf("not same typ %d != %d\n", dev->id->type, devtype);
> +               return -1;
> +       }
> +
> +       *off = part->offset;
> +       *size = part->size;
> +       *maxsize = part->size;
> +       *idx = dev->id->num;
> +
> +       return 0;
> +#else
> +       puts("offset is not a number\n");
> +       return -1;
> +#endif
> +}
> +
> +int arg_off(const char *arg, int *idx, loff_t *off, loff_t *size,
> +               loff_t *maxsize, int devtype, int chipsize)
> +{
> +       if (!str2off(arg, off))
> +               return get_part(arg, idx, off, size, maxsize, devtype);
> +
> +       if (*off >= chipsize) {
> +               puts("Offset exceeds device limit\n");
> +               return -1;
> +       }
> +
> +       *maxsize = chipsize - *off;
> +       *size = *maxsize;
> +       return 0;
> +}
> +
> +int arg_off_size(int argc, char *const argv[], int *idx, loff_t *off,
> +                loff_t *size, loff_t *maxsize, int devtype, int chipsize)
> +{
> +       int ret;
> +
> +       if (argc == 0) {
> +               *off = 0;
> +               *size = chipsize;
> +               *maxsize = *size;
> +               goto print;
> +       }
> +
> +       ret = arg_off(argv[0], idx, off, size, maxsize, devtype, chipsize);
> +       if (ret)
> +               return ret;
> +
> +       if (argc == 1)
> +               goto print;
> +
> +       if (!str2off(argv[1], size)) {
> +               printf("'%s' is not a number\n", argv[1]);
> +               return -1;
> +       }
> +
> +       if (*size > *maxsize) {
> +               puts("Size exceeds partition or device limit\n");
> +               return -1;
> +       }
> +
> +print:
> +       printf("device %d ", *idx);
> +       if (*size == chipsize)
> +               puts("whole chip\n");
> +       else
> +               printf("offset 0x%llx, size 0x%llx\n",
> +                      (unsigned long long)*off, (unsigned long long)*size);
> +       return 0;
> +}
> diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
> index 8666413..2861af5 100644
> --- a/include/linux/mtd/mtd.h
> +++ b/include/linux/mtd/mtd.h
> @@ -482,5 +482,12 @@ int add_mtd_device(struct mtd_info *mtd);
>  int del_mtd_device(struct mtd_info *mtd);
>  int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int);
>  int del_mtd_partitions(struct mtd_info *);
> +
> +int str2off(const char *p, loff_t *num);
> +int str2long(const char *p, ulong *num);
> +int arg_off(const char *arg, int *idx, loff_t *off, loff_t *size,
> +               loff_t *maxsize, int devtype, int chipsize);
> +int arg_off_size(int argc, char *const argv[], int *idx, loff_t *off,
> +                loff_t *size, loff_t *maxsize, int devtype, int chipsize);
>  #endif
>  #endif /* __MTD_MTD_H__ */
> --
> 2.1.0
>

thanks!
-- 
Jagan.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v5 3/3] spi, sf: use offset and size in sf cmd from mtdpartition
  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
  0 siblings, 1 reply; 16+ messages in thread
From: Jagan Teki @ 2015-04-22 10:58 UTC (permalink / raw)
  To: u-boot

On 20 April 2015 at 11:17, Heiko Schocher <hs@denx.de> wrote:
> with this patch, it is possible to get the offset and size information
> from the mtdpartiton setting in "mtdparts", similiar to the
> "nand" commandos.
>
> => sf
> sf - SPI flash sub-system
>
> Usage:
> sf probe [[bus:]cs] [hz] [mode] - init flash device on given SPI bus
>                                   and chip select
> sf read addr offset|partition len       - read `len' bytes starting at
>                                           `offset' to memory at `addr'
> sf write addr offset|partition len      - write `len' bytes from memory
>                                           at `addr' to flash at `offset'
> sf erase offset|partition [+]len        - erase `len' bytes from `offset'
>                                           `+len' round up `len' to block size
> sf update addr offset|partition len     - erase and write `len' bytes from memory
>                                           at `addr' to flash at `offset'
> =>
> for example "env" is defined in mtdparts:
>
> => sf read 13000000 env
> device 0 offset 0xd0000, size 0x10000
> SF: 65536 bytes @ 0xd0000 Read: OK
> =>
>
> Signed-off-by: Heiko Schocher <hs@denx.de>
>
> ---
>
> Changes in v2:
> - none
> Series-changes: 3
> - rebase with d6c1ffc7d23f4fe4ae8c91101861055b8e1501b6
> Series-changes: 4
> - rebased against 385a08a60f042061b004642d6b9bb6cfb794ad5a
> Series-changes: 5
> - no changes
>
>  common/cmd_sf.c | 50 +++++++++++++++++++++++++-------------------------
>  1 file changed, 25 insertions(+), 25 deletions(-)
>
> diff --git a/common/cmd_sf.c b/common/cmd_sf.c
> index 25a59e5..1932ac9 100644
> --- a/common/cmd_sf.c
> +++ b/common/cmd_sf.c
> @@ -12,6 +12,8 @@
>  #include <malloc.h>
>  #include <spi.h>
>  #include <spi_flash.h>
> +#include <jffs2/jffs2.h>
> +#include <linux/mtd/mtd.h>
>
>  #include <asm/io.h>
>  #include <dm/device-internal.h>
> @@ -258,23 +260,21 @@ static int spi_flash_update(struct spi_flash *flash, u32 offset,
>  static int do_spi_flash_read_write(int argc, char * const argv[])
>  {
>         unsigned long addr;
> -       unsigned long offset;
> -       unsigned long len;
>         void *buf;
>         char *endp;
>         int ret = 1;
> +       int dev = 0;
> +       loff_t offset, len, maxsize;
>
> -       if (argc < 4)
> +       if (argc < 3)
>                 return -1;
>
>         addr = simple_strtoul(argv[1], &endp, 16);
>         if (*argv[1] == 0 || *endp != 0)
>                 return -1;
> -       offset = simple_strtoul(argv[2], &endp, 16);
> -       if (*argv[2] == 0 || *endp != 0)
> -               return -1;
> -       len = simple_strtoul(argv[3], &endp, 16);
> -       if (*argv[3] == 0 || *endp != 0)
> +
> +       if (arg_off_size(argc - 2, &argv[2], &dev, &offset, &len, &maxsize,
> +           MTD_DEV_TYPE_NOR, flash->size))
>                 return -1;
>
>         /* Consistency checking */
> @@ -313,31 +313,31 @@ static int do_spi_flash_read_write(int argc, char * const argv[])
>
>  static int do_spi_flash_erase(int argc, char * const argv[])
>  {
> -       unsigned long offset;
> -       unsigned long len;
> -       char *endp;
>         int ret;
> +       int dev = 0;
> +       loff_t offset, len, maxsize;
> +       ulong size;
>
>         if (argc < 3)
>                 return -1;
>
> -       offset = simple_strtoul(argv[1], &endp, 16);
> -       if (*argv[1] == 0 || *endp != 0)
> +       if (arg_off(argv[1], &dev, &offset, &len, &maxsize,
> +           MTD_DEV_TYPE_NOR, flash->size))
>                 return -1;
>
> -       ret = sf_parse_len_arg(argv[2], &len);
> +       ret = sf_parse_len_arg(argv[2], &size);
>         if (ret != 1)
>                 return -1;
>
>         /* Consistency checking */
> -       if (offset + len > flash->size) {
> +       if (offset + size > flash->size) {
>                 printf("ERROR: attempting %s past flash size (%#x)\n",
>                        argv[0], flash->size);
>                 return 1;
>         }
>
> -       ret = spi_flash_erase(flash, offset, len);
> -       printf("SF: %zu bytes @ %#x Erased: %s\n", (size_t)len, (u32)offset,
> +       ret = spi_flash_erase(flash, offset, size);
> +       printf("SF: %zu bytes @ %#x Erased: %s\n", (size_t)size, (u32)offset,
>                ret ? "ERROR" : "OK");
>
>         return ret == 0 ? 0 : 1;
> @@ -562,13 +562,13 @@ U_BOOT_CMD(
>         "SPI flash sub-system",
>         "probe [[bus:]cs] [hz] [mode]   - init flash device on given SPI bus\n"
>         "                                 and chip select\n"
> -       "sf read addr offset len        - read `len' bytes starting at\n"
> -       "                                 `offset' to memory at `addr'\n"
> -       "sf write addr offset len       - write `len' bytes from memory\n"
> -       "                                 at `addr' to flash at `offset'\n"
> -       "sf erase offset [+]len         - erase `len' bytes from `offset'\n"
> -       "                                 `+len' round up `len' to block size\n"
> -       "sf update addr offset len      - erase and write `len' bytes from memory\n"
> -       "                                 at `addr' to flash at `offset'"
> +       "sf read addr offset|partition len      - read `len' bytes starting at\n"
> +       "                                         `offset' to memory at `addr'\n"

Append partition on help text as well more readable.

> +       "sf write addr offset|partition len     - write `len' bytes from memory\n"
> +       "                                         at `addr' to flash at `offset'\n"
> +       "sf erase offset|partition [+]len       - erase `len' bytes from `offset'\n"
> +       "                                        `+len' round up `len' to block size\n"
> +       "sf update addr offset|partition len    - erase and write `len' bytes from memory\n"
> +       "                                         at `addr' to flash at `offset'"
>         SF_TEST_HELP
>  );
> --
> 2.1.0
>

Reviewed-by: Jagannadha Sutradharudu Teki <jagannadh.teki@gmail.com>

thanks!
-- 
Jagan.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v5 2/3] mtd, nand: move common functions from cmd_nand.c to common place
  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
  1 sibling, 1 reply; 16+ messages in thread
From: Scott Wood @ 2015-04-22 22:47 UTC (permalink / raw)
  To: u-boot

On Mon, 2015-04-20 at 07:47 +0200, Heiko Schocher wrote:
> @@ -322,7 +213,12 @@ int do_nand_env_oob(cmd_tbl_t *cmdtp, int argc, char *const argv[])
>  			goto usage;
>  
>  		/* We don't care about size, or maxsize. */
> -		if (arg_off(argv[2], &idx, &addr, &maxsize, &maxsize)) {
> +		if (arg_off(argv[2], &idx, &addr, &maxsize, &maxsize,
> +			    MTD_DEV_TYPE_NAND, nand_info[idx].size)) {
> +				puts("Offset or partition name expected\n");
> +				return 1;
> +		}

Use only one tab per indentation level.

> diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
> index 8666413..2861af5 100644
> --- a/include/linux/mtd/mtd.h
> +++ b/include/linux/mtd/mtd.h
> @@ -482,5 +482,12 @@ int add_mtd_device(struct mtd_info *mtd);
>  int del_mtd_device(struct mtd_info *mtd);
>  int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int);
>  int del_mtd_partitions(struct mtd_info *);
> +
> +int str2off(const char *p, loff_t *num);
> +int str2long(const char *p, ulong *num);

These should be moved somewhere more generic, especially if they're no
longer file-local.

> +int arg_off(const char *arg, int *idx, loff_t *off, loff_t *size,
> +		loff_t *maxsize, int devtype, int chipsize);
> +int arg_off_size(int argc, char *const argv[], int *idx, loff_t *off,
> +		 loff_t *size, loff_t *maxsize, int devtype, int chipsize);

Add an mtd prefix.

-Scott

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v5 1/3] mtd, spi: add MTD layer driver
  2015-04-22 10:52   ` Jagan Teki
@ 2015-04-23  5:27     ` Heiko Schocher
  0 siblings, 0 replies; 16+ messages in thread
From: Heiko Schocher @ 2015-04-23  5:27 UTC (permalink / raw)
  To: u-boot

Hello Jagan,

Am 22.04.2015 12:52, schrieb Jagan Teki:
> 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.

Yes, done.

>>          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

really? ... I thought we want to prevent #ifdefs in Code ...
Changed...

>> +
>>   #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?

Yep, fixed.

>> +
>>          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!

Thanks for the review

bye,
Heiko
-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v5 3/3] spi, sf: use offset and size in sf cmd from mtdpartition
  2015-04-22 10:58   ` Jagan Teki
@ 2015-04-23  5:38     ` Heiko Schocher
  0 siblings, 0 replies; 16+ messages in thread
From: Heiko Schocher @ 2015-04-23  5:38 UTC (permalink / raw)
  To: u-boot

Hello Jagan,

Am 22.04.2015 12:58, schrieb Jagan Teki:
> On 20 April 2015 at 11:17, Heiko Schocher <hs@denx.de> wrote:
>> with this patch, it is possible to get the offset and size information
>> from the mtdpartiton setting in "mtdparts", similiar to the
>> "nand" commandos.
>>
>> => sf
>> sf - SPI flash sub-system
>>
>> Usage:
>> sf probe [[bus:]cs] [hz] [mode] - init flash device on given SPI bus
>>                                    and chip select
>> sf read addr offset|partition len       - read `len' bytes starting at
>>                                            `offset' to memory at `addr'
>> sf write addr offset|partition len      - write `len' bytes from memory
>>                                            at `addr' to flash at `offset'
>> sf erase offset|partition [+]len        - erase `len' bytes from `offset'
>>                                            `+len' round up `len' to block size
>> sf update addr offset|partition len     - erase and write `len' bytes from memory
>>                                            at `addr' to flash at `offset'
>> =>
>> for example "env" is defined in mtdparts:
>>
>> => sf read 13000000 env
>> device 0 offset 0xd0000, size 0x10000
>> SF: 65536 bytes @ 0xd0000 Read: OK
>> =>
>>
>> Signed-off-by: Heiko Schocher <hs@denx.de>
>>
>> ---
>>
>> Changes in v2:
>> - none
>> Series-changes: 3
>> - rebase with d6c1ffc7d23f4fe4ae8c91101861055b8e1501b6
>> Series-changes: 4
>> - rebased against 385a08a60f042061b004642d6b9bb6cfb794ad5a
>> Series-changes: 5
>> - no changes
>>
>>   common/cmd_sf.c | 50 +++++++++++++++++++++++++-------------------------
>>   1 file changed, 25 insertions(+), 25 deletions(-)
>>
>> diff --git a/common/cmd_sf.c b/common/cmd_sf.c
>> index 25a59e5..1932ac9 100644
>> --- a/common/cmd_sf.c
>> +++ b/common/cmd_sf.c
>> @@ -12,6 +12,8 @@
>>   #include <malloc.h>
>>   #include <spi.h>
>>   #include <spi_flash.h>
>> +#include <jffs2/jffs2.h>
>> +#include <linux/mtd/mtd.h>
>>
>>   #include <asm/io.h>
>>   #include <dm/device-internal.h>
>> @@ -258,23 +260,21 @@ static int spi_flash_update(struct spi_flash *flash, u32 offset,
>>   static int do_spi_flash_read_write(int argc, char * const argv[])
>>   {
>>          unsigned long addr;
>> -       unsigned long offset;
>> -       unsigned long len;
>>          void *buf;
>>          char *endp;
>>          int ret = 1;
>> +       int dev = 0;
>> +       loff_t offset, len, maxsize;
>>
>> -       if (argc < 4)
>> +       if (argc < 3)
>>                  return -1;
>>
>>          addr = simple_strtoul(argv[1], &endp, 16);
>>          if (*argv[1] == 0 || *endp != 0)
>>                  return -1;
>> -       offset = simple_strtoul(argv[2], &endp, 16);
>> -       if (*argv[2] == 0 || *endp != 0)
>> -               return -1;
>> -       len = simple_strtoul(argv[3], &endp, 16);
>> -       if (*argv[3] == 0 || *endp != 0)
>> +
>> +       if (arg_off_size(argc - 2, &argv[2], &dev, &offset, &len, &maxsize,
>> +           MTD_DEV_TYPE_NOR, flash->size))
>>                  return -1;
>>
>>          /* Consistency checking */
>> @@ -313,31 +313,31 @@ static int do_spi_flash_read_write(int argc, char * const argv[])
>>
>>   static int do_spi_flash_erase(int argc, char * const argv[])
>>   {
>> -       unsigned long offset;
>> -       unsigned long len;
>> -       char *endp;
>>          int ret;
>> +       int dev = 0;
>> +       loff_t offset, len, maxsize;
>> +       ulong size;
>>
>>          if (argc < 3)
>>                  return -1;
>>
>> -       offset = simple_strtoul(argv[1], &endp, 16);
>> -       if (*argv[1] == 0 || *endp != 0)
>> +       if (arg_off(argv[1], &dev, &offset, &len, &maxsize,
>> +           MTD_DEV_TYPE_NOR, flash->size))
>>                  return -1;
>>
>> -       ret = sf_parse_len_arg(argv[2], &len);
>> +       ret = sf_parse_len_arg(argv[2], &size);
>>          if (ret != 1)
>>                  return -1;
>>
>>          /* Consistency checking */
>> -       if (offset + len > flash->size) {
>> +       if (offset + size > flash->size) {
>>                  printf("ERROR: attempting %s past flash size (%#x)\n",
>>                         argv[0], flash->size);
>>                  return 1;
>>          }
>>
>> -       ret = spi_flash_erase(flash, offset, len);
>> -       printf("SF: %zu bytes @ %#x Erased: %s\n", (size_t)len, (u32)offset,
>> +       ret = spi_flash_erase(flash, offset, size);
>> +       printf("SF: %zu bytes @ %#x Erased: %s\n", (size_t)size, (u32)offset,
>>                 ret ? "ERROR" : "OK");
>>
>>          return ret == 0 ? 0 : 1;
>> @@ -562,13 +562,13 @@ U_BOOT_CMD(
>>          "SPI flash sub-system",
>>          "probe [[bus:]cs] [hz] [mode]   - init flash device on given SPI bus\n"
>>          "                                 and chip select\n"
>> -       "sf read addr offset len        - read `len' bytes starting at\n"
>> -       "                                 `offset' to memory at `addr'\n"
>> -       "sf write addr offset len       - write `len' bytes from memory\n"
>> -       "                                 at `addr' to flash at `offset'\n"
>> -       "sf erase offset [+]len         - erase `len' bytes from `offset'\n"
>> -       "                                 `+len' round up `len' to block size\n"
>> -       "sf update addr offset len      - erase and write `len' bytes from memory\n"
>> -       "                                 at `addr' to flash at `offset'"
>> +       "sf read addr offset|partition len      - read `len' bytes starting at\n"
>> +       "                                         `offset' to memory at `addr'\n"
>
> Append partition on help text as well more readable.

Added.

>> +       "sf write addr offset|partition len     - write `len' bytes from memory\n"
>> +       "                                         at `addr' to flash at `offset'\n"
>> +       "sf erase offset|partition [+]len       - erase `len' bytes from `offset'\n"
>> +       "                                        `+len' round up `len' to block size\n"
>> +       "sf update addr offset|partition len    - erase and write `len' bytes from memory\n"
>> +       "                                         at `addr' to flash at `offset'"
>>          SF_TEST_HELP
>>   );
>> --
>> 2.1.0
>>
>
> Reviewed-by: Jagannadha Sutradharudu Teki <jagannadh.teki@gmail.com>
>
> thanks!

Thanks for your time!

bye,
Heiko
-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v5 2/3] mtd, nand: move common functions from cmd_nand.c to common place
  2015-04-22 22:47   ` Scott Wood
@ 2015-04-23  5:57     ` Heiko Schocher
  2015-04-23  6:55       ` Scott Wood
  0 siblings, 1 reply; 16+ messages in thread
From: Heiko Schocher @ 2015-04-23  5:57 UTC (permalink / raw)
  To: u-boot

Hello Scott,

Am 23.04.2015 00:47, schrieb Scott Wood:
> On Mon, 2015-04-20 at 07:47 +0200, Heiko Schocher wrote:
>> @@ -322,7 +213,12 @@ int do_nand_env_oob(cmd_tbl_t *cmdtp, int argc, char *const argv[])
>>   			goto usage;
>>
>>   		/* We don't care about size, or maxsize. */
>> -		if (arg_off(argv[2], &idx, &addr, &maxsize, &maxsize)) {
>> +		if (arg_off(argv[2], &idx, &addr, &maxsize, &maxsize,
>> +			    MTD_DEV_TYPE_NAND, nand_info[idx].size)) {
>> +				puts("Offset or partition name expected\n");
>> +				return 1;
>> +		}
>
> Use only one tab per indentation level.

You mean the line "MTD_DEV_TYPE_NAND, nand_info[idx].size)) {" ?

I have to move MTD_xx to the opening bracket to avoid checkpatch.pl
errors ...

If you mean the "puts ..." line ... fixed.

>> diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
>> index 8666413..2861af5 100644
>> --- a/include/linux/mtd/mtd.h
>> +++ b/include/linux/mtd/mtd.h
>> @@ -482,5 +482,12 @@ int add_mtd_device(struct mtd_info *mtd);
>>   int del_mtd_device(struct mtd_info *mtd);
>>   int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int);
>>   int del_mtd_partitions(struct mtd_info *);
>> +
>> +int str2off(const char *p, loff_t *num);
>> +int str2long(const char *p, ulong *num);
>
> These should be moved somewhere more generic, especially if they're no
> longer file-local.

Hmm... the code is currently in "drivers/mtd/mtd_uboot.c" ... maybe
we add a "mtd_" prefix to them? I think these functions are mtd specific ...

>> +int arg_off(const char *arg, int *idx, loff_t *off, loff_t *size,
>> +		loff_t *maxsize, int devtype, int chipsize);
>> +int arg_off_size(int argc, char *const argv[], int *idx, loff_t *off,
>> +		 loff_t *size, loff_t *maxsize, int devtype, int chipsize);
>
> Add an mtd prefix.

Done.

Thanks for your time!

bye,
Heiko
-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v5 2/3] mtd, nand: move common functions from cmd_nand.c to common place
  2015-04-23  5:57     ` Heiko Schocher
@ 2015-04-23  6:55       ` Scott Wood
  2015-04-23 11:12         ` Heiko Schocher
  0 siblings, 1 reply; 16+ messages in thread
From: Scott Wood @ 2015-04-23  6:55 UTC (permalink / raw)
  To: u-boot

On Thu, 2015-04-23 at 07:57 +0200, Heiko Schocher wrote:
> Hello Scott,
> 
> Am 23.04.2015 00:47, schrieb Scott Wood:
> > On Mon, 2015-04-20 at 07:47 +0200, Heiko Schocher wrote:
> >> @@ -322,7 +213,12 @@ int do_nand_env_oob(cmd_tbl_t *cmdtp, int argc, char *const argv[])
> >>   			goto usage;
> >>
> >>   		/* We don't care about size, or maxsize. */
> >> -		if (arg_off(argv[2], &idx, &addr, &maxsize, &maxsize)) {
> >> +		if (arg_off(argv[2], &idx, &addr, &maxsize, &maxsize,
> >> +			    MTD_DEV_TYPE_NAND, nand_info[idx].size)) {
> >> +				puts("Offset or partition name expected\n");
> >> +				return 1;
> >> +		}
> >
> > Use only one tab per indentation level.
> 
> You mean the line "MTD_DEV_TYPE_NAND, nand_info[idx].size)) {" ?
> 
> I have to move MTD_xx to the opening bracket to avoid checkpatch.pl
> errors ...
> 
> If you mean the "puts ..." line ... fixed.

I meant the puts and return lines.

> >> diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
> >> index 8666413..2861af5 100644
> >> --- a/include/linux/mtd/mtd.h
> >> +++ b/include/linux/mtd/mtd.h
> >> @@ -482,5 +482,12 @@ int add_mtd_device(struct mtd_info *mtd);
> >>   int del_mtd_device(struct mtd_info *mtd);
> >>   int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int);
> >>   int del_mtd_partitions(struct mtd_info *);
> >> +
> >> +int str2off(const char *p, loff_t *num);
> >> +int str2long(const char *p, ulong *num);
> >
> > These should be moved somewhere more generic, especially if they're no
> > longer file-local.
> 
> Hmm... the code is currently in "drivers/mtd/mtd_uboot.c" ... maybe
> we add a "mtd_" prefix to them? I think these functions are mtd specific ...

What is mtd-specific about them?

-Scott

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v5 2/3] mtd, nand: move common functions from cmd_nand.c to common place
  2015-04-23  6:55       ` Scott Wood
@ 2015-04-23 11:12         ` Heiko Schocher
  2015-04-23 17:48           ` Scott Wood
  0 siblings, 1 reply; 16+ messages in thread
From: Heiko Schocher @ 2015-04-23 11:12 UTC (permalink / raw)
  To: u-boot

Hello Scott,

Am 23.04.2015 08:55, schrieb Scott Wood:
> On Thu, 2015-04-23 at 07:57 +0200, Heiko Schocher wrote:
>> Hello Scott,
>>
>> Am 23.04.2015 00:47, schrieb Scott Wood:
>>> On Mon, 2015-04-20 at 07:47 +0200, Heiko Schocher wrote:
>>>> @@ -322,7 +213,12 @@ int do_nand_env_oob(cmd_tbl_t *cmdtp, int argc, char *const argv[])
>>>>    			goto usage;
>>>>
>>>>    		/* We don't care about size, or maxsize. */
>>>> -		if (arg_off(argv[2], &idx, &addr, &maxsize, &maxsize)) {
>>>> +		if (arg_off(argv[2], &idx, &addr, &maxsize, &maxsize,
>>>> +			    MTD_DEV_TYPE_NAND, nand_info[idx].size)) {
>>>> +				puts("Offset or partition name expected\n");
>>>> +				return 1;
>>>> +		}
>>>
>>> Use only one tab per indentation level.
>>
>> You mean the line "MTD_DEV_TYPE_NAND, nand_info[idx].size)) {" ?
>>
>> I have to move MTD_xx to the opening bracket to avoid checkpatch.pl
>> errors ...
>>
>> If you mean the "puts ..." line ... fixed.
>
> I meant the puts and return lines.
>
>>>> diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
>>>> index 8666413..2861af5 100644
>>>> --- a/include/linux/mtd/mtd.h
>>>> +++ b/include/linux/mtd/mtd.h
>>>> @@ -482,5 +482,12 @@ int add_mtd_device(struct mtd_info *mtd);
>>>>    int del_mtd_device(struct mtd_info *mtd);
>>>>    int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int);
>>>>    int del_mtd_partitions(struct mtd_info *);
>>>> +
>>>> +int str2off(const char *p, loff_t *num);
>>>> +int str2long(const char *p, ulong *num);
>>>
>>> These should be moved somewhere more generic, especially if they're no
>>> longer file-local.
>>
>> Hmm... the code is currently in "drivers/mtd/mtd_uboot.c" ... maybe
>> we add a "mtd_" prefix to them? I think these functions are mtd specific ...
>
> What is mtd-specific about them?

Hmm... I thought:

return *p != '\0' && *endptr == '\0';

is more or less mtd specific ... but you are right, it is not really
mtd specific ... so I move them to "./lib/vsprintf.c" ... Ok?

bye,
Heiko
-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v5 2/3] mtd, nand: move common functions from cmd_nand.c to common place
  2015-04-23 11:12         ` Heiko Schocher
@ 2015-04-23 17:48           ` Scott Wood
  2015-04-24  4:59             ` Heiko Schocher
  0 siblings, 1 reply; 16+ messages in thread
From: Scott Wood @ 2015-04-23 17:48 UTC (permalink / raw)
  To: u-boot

On Thu, 2015-04-23 at 13:12 +0200, Heiko Schocher wrote:
> Hello Scott,
> 
> Am 23.04.2015 08:55, schrieb Scott Wood:
> > On Thu, 2015-04-23 at 07:57 +0200, Heiko Schocher wrote:
> >> Hello Scott,
> >>
> >> Am 23.04.2015 00:47, schrieb Scott Wood:
> >>> On Mon, 2015-04-20 at 07:47 +0200, Heiko Schocher wrote:
> >>>> +int str2off(const char *p, loff_t *num);
> >>>> +int str2long(const char *p, ulong *num);
> >>>
> >>> These should be moved somewhere more generic, especially if they're no
> >>> longer file-local.
> >>
> >> Hmm... the code is currently in "drivers/mtd/mtd_uboot.c" ... maybe
> >> we add a "mtd_" prefix to them? I think these functions are mtd specific ...
> >
> > What is mtd-specific about them?
> 
> Hmm... I thought:
> 
> return *p != '\0' && *endptr == '\0';
> 
> is more or less mtd specific ... but you are right, it is not really
> mtd specific ... so I move them to "./lib/vsprintf.c" ... Ok?

OK.  Maybe change the return to bool while you're at it, to make it
clear that it isn't return-zero-on-success.

-Scott

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v5 2/3] mtd, nand: move common functions from cmd_nand.c to common place
  2015-04-23 17:48           ` Scott Wood
@ 2015-04-24  4:59             ` Heiko Schocher
  2015-04-24  5:25               ` Scott Wood
  0 siblings, 1 reply; 16+ messages in thread
From: Heiko Schocher @ 2015-04-24  4:59 UTC (permalink / raw)
  To: u-boot

Hello Scott,

Am 23.04.2015 19:48, schrieb Scott Wood:
> On Thu, 2015-04-23 at 13:12 +0200, Heiko Schocher wrote:
>> Hello Scott,
>>
>> Am 23.04.2015 08:55, schrieb Scott Wood:
>>> On Thu, 2015-04-23 at 07:57 +0200, Heiko Schocher wrote:
>>>> Hello Scott,
>>>>
>>>> Am 23.04.2015 00:47, schrieb Scott Wood:
>>>>> On Mon, 2015-04-20 at 07:47 +0200, Heiko Schocher wrote:
>>>>>> +int str2off(const char *p, loff_t *num);
>>>>>> +int str2long(const char *p, ulong *num);
>>>>>
>>>>> These should be moved somewhere more generic, especially if they're no
>>>>> longer file-local.
>>>>
>>>> Hmm... the code is currently in "drivers/mtd/mtd_uboot.c" ... maybe
>>>> we add a "mtd_" prefix to them? I think these functions are mtd specific ...
>>>
>>> What is mtd-specific about them?
>>
>> Hmm... I thought:
>>
>> return *p != '\0' && *endptr == '\0';
>>
>> is more or less mtd specific ... but you are right, it is not really
>> mtd specific ... so I move them to "./lib/vsprintf.c" ... Ok?
>
> OK.  Maybe change the return to bool while you're at it, to make it
> clear that it isn't return-zero-on-success.

Hmm.. tried this, but I get:

   CC      common/cmd_test.o
In file included from /home/hs/abb/imx6/u-boot/include/common.h:760:0,
                  from /home/hs/abb/imx6/u-boot/common/cmd_test.c:17:
/home/hs/abb/imx6/u-boot/include/vsprintf.h:176:1: error: unknown type name 'bool'
/home/hs/abb/imx6/u-boot/include/vsprintf.h:177:1: error: unknown type name 'bool'
/home/hs/abb/imx6/u-boot/scripts/Makefile.build:276: recipe for target 'common/cmd_test.o' failed
make[2]: *** [common/cmd_test.o] Error 1
/home/hs/abb/imx6/u-boot/Makefile:1156: recipe for target 'common' failed
make[1]: *** [common] Error 2

reason is in common/cmd_test.c:

/*
  * Define _STDBOOL_H here to avoid macro expansion of true and false.
  * If the future code requires macro true or false, remove this define
  * and undef true and false before U_BOOT_CMD. This define and comment
  * shall be removed if change to U_BOOT_CMD is made to take string
  * instead of stringifying it.
  */
#define _STDBOOL_H

#include <common.h>

Hmm... I tend to say, this is another patch changing the returntype
from int to bool ...

bye,
Heiko
-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [U-Boot] [PATCH v5 2/3] mtd, nand: move common functions from cmd_nand.c to common place
  2015-04-24  4:59             ` Heiko Schocher
@ 2015-04-24  5:25               ` Scott Wood
  0 siblings, 0 replies; 16+ messages in thread
From: Scott Wood @ 2015-04-24  5:25 UTC (permalink / raw)
  To: u-boot

On Fri, 2015-04-24 at 06:59 +0200, Heiko Schocher wrote:
> Hello Scott,
> 
> Am 23.04.2015 19:48, schrieb Scott Wood:
> > On Thu, 2015-04-23 at 13:12 +0200, Heiko Schocher wrote:
> >> Hello Scott,
> >>
> >> Am 23.04.2015 08:55, schrieb Scott Wood:
> >>> On Thu, 2015-04-23 at 07:57 +0200, Heiko Schocher wrote:
> >>>> Hello Scott,
> >>>>
> >>>> Am 23.04.2015 00:47, schrieb Scott Wood:
> >>>>> On Mon, 2015-04-20 at 07:47 +0200, Heiko Schocher wrote:
> >>>>>> +int str2off(const char *p, loff_t *num);
> >>>>>> +int str2long(const char *p, ulong *num);
> >>>>>
> >>>>> These should be moved somewhere more generic, especially if they're no
> >>>>> longer file-local.
> >>>>
> >>>> Hmm... the code is currently in "drivers/mtd/mtd_uboot.c" ... maybe
> >>>> we add a "mtd_" prefix to them? I think these functions are mtd specific ...
> >>>
> >>> What is mtd-specific about them?
> >>
> >> Hmm... I thought:
> >>
> >> return *p != '\0' && *endptr == '\0';
> >>
> >> is more or less mtd specific ... but you are right, it is not really
> >> mtd specific ... so I move them to "./lib/vsprintf.c" ... Ok?
> >
> > OK.  Maybe change the return to bool while you're at it, to make it
> > clear that it isn't return-zero-on-success.
> 
> Hmm.. tried this, but I get:
> 
>    CC      common/cmd_test.o
> In file included from /home/hs/abb/imx6/u-boot/include/common.h:760:0,
>                   from /home/hs/abb/imx6/u-boot/common/cmd_test.c:17:
> /home/hs/abb/imx6/u-boot/include/vsprintf.h:176:1: error: unknown type name 'bool'
> /home/hs/abb/imx6/u-boot/include/vsprintf.h:177:1: error: unknown type name 'bool'
> /home/hs/abb/imx6/u-boot/scripts/Makefile.build:276: recipe for target 'common/cmd_test.o' failed
> make[2]: *** [common/cmd_test.o] Error 1
> /home/hs/abb/imx6/u-boot/Makefile:1156: recipe for target 'common' failed
> make[1]: *** [common] Error 2
> 
> reason is in common/cmd_test.c:
> 
> /*
>   * Define _STDBOOL_H here to avoid macro expansion of true and false.
>   * If the future code requires macro true or false, remove this define
>   * and undef true and false before U_BOOT_CMD. This define and comment
>   * shall be removed if change to U_BOOT_CMD is made to take string
>   * instead of stringifying it.
>   */
> #define _STDBOOL_H

Ugh.  Maybe add a variant of U_BOOT_CMD_COMPLETE that takes a string for
the user-visible name that is separate from the C-visible symbol used
for the ll entry.

Or you could either define bool manually, or do what the comment says
and undef true/false.

> #include <common.h>
> 
> Hmm... I tend to say, this is another patch changing the returntype
> from int to bool ...

It's related because you're moving it from being a local static function
to being an API exposed treewide, so higher standards apply.

Another option would be to convert it to returning zero on success and a
negative error code on error.

-Scott

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2015-04-24  5:25 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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
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

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.