All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 1/4] dfu: defer parsing of device string to IO backend
@ 2014-06-11 22:03 Stephen Warren
  2014-06-11 22:03 ` [U-Boot] [PATCH 2/4] dfu: allow backend to specify a maximum buffer size Stephen Warren
                   ` (3 more replies)
  0 siblings, 4 replies; 16+ messages in thread
From: Stephen Warren @ 2014-06-11 22:03 UTC (permalink / raw)
  To: u-boot

From: Stephen Warren <swarren@nvidia.com>

Devices are not all identified by a single integer. To support
this, defer the parsing of the device string to the IO backed, so that
it can apply the appropriate rules.

SPI devices are specified as controller:chip_select. SPI/SF support will
be added soon.

MMC devices can also be specified as controller[.hwpart][:partition] in
many commands, although we don't support that syntax in DFU.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
---
 common/cmd_dfu.c       |  3 +--
 drivers/dfu/dfu.c      | 20 ++++++++++----------
 drivers/dfu/dfu_mmc.c  | 21 ++++++++++++---------
 drivers/dfu/dfu_nand.c |  2 +-
 drivers/dfu/dfu_ram.c  |  2 +-
 include/dfu.h          | 22 +++++++++++++---------
 6 files changed, 38 insertions(+), 32 deletions(-)

diff --git a/common/cmd_dfu.c b/common/cmd_dfu.c
index 433bddd5d2bd..2633b30e556f 100644
--- a/common/cmd_dfu.c
+++ b/common/cmd_dfu.c
@@ -24,8 +24,7 @@ static int do_dfu(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
 	int ret, i = 0;
 
-	ret = dfu_init_env_entities(interface, simple_strtoul(devstring,
-							      NULL, 10));
+	ret = dfu_init_env_entities(interface, devstring);
 	if (ret)
 		goto done;
 
diff --git a/drivers/dfu/dfu.c b/drivers/dfu/dfu.c
index 1bf66d0613c9..26d3b44e40f5 100644
--- a/drivers/dfu/dfu.c
+++ b/drivers/dfu/dfu.c
@@ -44,7 +44,7 @@ static int dfu_find_alt_num(const char *s)
 	return ++i;
 }
 
-int dfu_init_env_entities(char *interface, int dev)
+int dfu_init_env_entities(char *interface, char *devstr)
 {
 	const char *str_env;
 	char *env_bkp;
@@ -57,7 +57,7 @@ int dfu_init_env_entities(char *interface, int dev)
 	}
 
 	env_bkp = strdup(str_env);
-	ret = dfu_config_entities(env_bkp, interface, dev);
+	ret = dfu_config_entities(env_bkp, interface, devstr);
 	if (ret) {
 		error("DFU entities configuration failed!\n");
 		return ret;
@@ -389,26 +389,25 @@ int dfu_read(struct dfu_entity *dfu, void *buf, int size, int blk_seq_num)
 }
 
 static int dfu_fill_entity(struct dfu_entity *dfu, char *s, int alt,
-			   char *interface, int num)
+			   char *interface, char *devstr)
 {
 	char *st;
 
-	debug("%s: %s interface: %s num: %d\n", __func__, s, interface, num);
+	debug("%s: %s interface: %s dev: %s\n", __func__, s, interface, devstr);
 	st = strsep(&s, " ");
 	strcpy(dfu->name, st);
 
-	dfu->dev_num = num;
 	dfu->alt = alt;
 
 	/* Specific for mmc device */
 	if (strcmp(interface, "mmc") == 0) {
-		if (dfu_fill_entity_mmc(dfu, s))
+		if (dfu_fill_entity_mmc(dfu, devstr, s))
 			return -1;
 	} else if (strcmp(interface, "nand") == 0) {
-		if (dfu_fill_entity_nand(dfu, s))
+		if (dfu_fill_entity_nand(dfu, devstr, s))
 			return -1;
 	} else if (strcmp(interface, "ram") == 0) {
-		if (dfu_fill_entity_ram(dfu, s))
+		if (dfu_fill_entity_ram(dfu, devstr, s))
 			return -1;
 	} else {
 		printf("%s: Device %s not (yet) supported!\n",
@@ -434,7 +433,7 @@ void dfu_free_entities(void)
 	alt_num_cnt = 0;
 }
 
-int dfu_config_entities(char *env, char *interface, int num)
+int dfu_config_entities(char *env, char *interface, char *devstr)
 {
 	struct dfu_entity *dfu;
 	int i, ret;
@@ -457,7 +456,8 @@ int dfu_config_entities(char *env, char *interface, int num)
 	for (i = 0; i < dfu_alt_num; i++) {
 
 		s = strsep(&env, ";");
-		ret = dfu_fill_entity(&dfu[i], s, alt_num_cnt, interface, num);
+		ret = dfu_fill_entity(&dfu[i], s, alt_num_cnt, interface,
+				      devstr);
 		if (ret)
 			return -1;
 
diff --git a/drivers/dfu/dfu_mmc.c b/drivers/dfu/dfu_mmc.c
index 322bd8c5d2de..72fa03eedaec 100644
--- a/drivers/dfu/dfu_mmc.c
+++ b/drivers/dfu/dfu_mmc.c
@@ -27,7 +27,7 @@ static int mmc_access_part(struct dfu_entity *dfu, struct mmc *mmc, int part)
 	if (part == mmc->part_num)
 		return 0;
 
-	ret = mmc_switch_part(dfu->dev_num, part);
+	ret = mmc_switch_part(dfu->data.mmc.dev_num, part);
 	if (ret) {
 		error("Cannot switch to partition %d\n", part);
 		return ret;
@@ -40,7 +40,7 @@ static int mmc_access_part(struct dfu_entity *dfu, struct mmc *mmc, int part)
 static int mmc_block_op(enum dfu_op op, struct dfu_entity *dfu,
 			u64 offset, void *buf, long *len)
 {
-	struct mmc *mmc = find_mmc_device(dfu->dev_num);
+	struct mmc *mmc = find_mmc_device(dfu->data.mmc.dev_num);
 	u32 blk_start, blk_count, n = 0;
 	int ret, part_num_bkp = 0;
 
@@ -67,15 +67,15 @@ static int mmc_block_op(enum dfu_op op, struct dfu_entity *dfu,
 	}
 
 	debug("%s: %s dev: %d start: %d cnt: %d buf: 0x%p\n", __func__,
-	      op == DFU_OP_READ ? "MMC READ" : "MMC WRITE", dfu->dev_num,
-	      blk_start, blk_count, buf);
+	      op == DFU_OP_READ ? "MMC READ" : "MMC WRITE",
+	      dfu->data.mmc.dev_num, blk_start, blk_count, buf);
 	switch (op) {
 	case DFU_OP_READ:
-		n = mmc->block_dev.block_read(dfu->dev_num, blk_start,
+		n = mmc->block_dev.block_read(dfu->data.mmc.dev_num, blk_start,
 					      blk_count, buf);
 		break;
 	case DFU_OP_WRITE:
-		n = mmc->block_dev.block_write(dfu->dev_num, blk_start,
+		n = mmc->block_dev.block_write(dfu->data.mmc.dev_num, blk_start,
 					       blk_count, buf);
 		break;
 	default:
@@ -270,7 +270,7 @@ int dfu_read_medium_mmc(struct dfu_entity *dfu, u64 offset, void *buf,
  *	4th (optional):
  *		mmcpart <num> (access to HW eMMC partitions)
  */
-int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *s)
+int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *devstr, char *s)
 {
 	const char *entity_type;
 	size_t second_arg;
@@ -281,6 +281,8 @@ int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *s)
 	const char *argv[3];
 	const char **parg = argv;
 
+	dfu->data.mmc.dev_num = simple_strtoul(devstr, NULL, 10);
+
 	for (; parg < argv + sizeof(argv) / sizeof(*argv); ++parg) {
 		*parg = strsep(&s, " ");
 		if (*parg == NULL) {
@@ -297,9 +299,10 @@ int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *s)
 	second_arg = simple_strtoul(argv[1], NULL, 0);
 	third_arg = simple_strtoul(argv[2], NULL, 0);
 
-	mmc = find_mmc_device(dfu->dev_num);
+	mmc = find_mmc_device(dfu->data.mmc.dev_num);
 	if (mmc == NULL) {
-		error("Couldn't find MMC device no. %d.\n", dfu->dev_num);
+		error("Couldn't find MMC device no. %d.\n",
+		      dfu->data.mmc.dev_num);
 		return -ENODEV;
 	}
 
diff --git a/drivers/dfu/dfu_nand.c b/drivers/dfu/dfu_nand.c
index e1c9a8849246..f9ee18999ab7 100644
--- a/drivers/dfu/dfu_nand.c
+++ b/drivers/dfu/dfu_nand.c
@@ -179,7 +179,7 @@ unsigned int dfu_polltimeout_nand(struct dfu_entity *dfu)
 	return DFU_DEFAULT_POLL_TIMEOUT;
 }
 
-int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
+int dfu_fill_entity_nand(struct dfu_entity *dfu, char *devstr, char *s)
 {
 	char *st;
 	int ret, dev, part;
diff --git a/drivers/dfu/dfu_ram.c b/drivers/dfu/dfu_ram.c
index b6c6e60c443c..e094a946f6be 100644
--- a/drivers/dfu/dfu_ram.c
+++ b/drivers/dfu/dfu_ram.c
@@ -52,7 +52,7 @@ static int dfu_read_medium_ram(struct dfu_entity *dfu, u64 offset,
 	return dfu_transfer_medium_ram(DFU_OP_READ, dfu, offset, buf, len);
 }
 
-int dfu_fill_entity_ram(struct dfu_entity *dfu, char *s)
+int dfu_fill_entity_ram(struct dfu_entity *dfu, char *devstr, char *s)
 {
 	char *st;
 
diff --git a/include/dfu.h b/include/dfu.h
index df720310f2cc..21390aa9b7b3 100644
--- a/include/dfu.h
+++ b/include/dfu.h
@@ -39,6 +39,8 @@ enum dfu_op {
 };
 
 struct mmc_internal_data {
+	int dev_num;
+
 	/* RAW programming */
 	unsigned int lba_start;
 	unsigned int lba_size;
@@ -87,7 +89,6 @@ struct dfu_entity {
 	char			name[DFU_NAME_SIZE];
 	int                     alt;
 	void                    *dev_private;
-	int                     dev_num;
 	enum dfu_device_type    dev_type;
 	enum dfu_layout         layout;
 
@@ -125,7 +126,7 @@ struct dfu_entity {
 	unsigned int inited:1;
 };
 
-int dfu_config_entities(char *s, char *interface, int num);
+int dfu_config_entities(char *s, char *interface, char *devstr);
 void dfu_free_entities(void);
 void dfu_show_entities(void);
 int dfu_get_alt_number(void);
@@ -136,7 +137,7 @@ char *dfu_extract_token(char** e, int *n);
 void dfu_trigger_reset(void);
 int dfu_get_alt(char *name);
 bool dfu_reset(void);
-int dfu_init_env_entities(char *interface, int dev);
+int dfu_init_env_entities(char *interface, char *devstr);
 unsigned char *dfu_get_buf(void);
 unsigned char *dfu_free_buf(void);
 unsigned long dfu_get_buf_size(void);
@@ -146,9 +147,10 @@ int dfu_write(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
 int dfu_flush(struct dfu_entity *de, void *buf, int size, int blk_seq_num);
 /* Device specific */
 #ifdef CONFIG_DFU_MMC
-extern int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *s);
+extern int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *devstr, char *s);
 #else
-static inline int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *s)
+static inline int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *devstr,
+				      char *s)
 {
 	puts("MMC support not available!\n");
 	return -1;
@@ -156,9 +158,10 @@ static inline int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *s)
 #endif
 
 #ifdef CONFIG_DFU_NAND
-extern int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s);
+extern int dfu_fill_entity_nand(struct dfu_entity *dfu, char *devstr, char *s);
 #else
-static inline int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
+static inline int dfu_fill_entity_nand(struct dfu_entity *dfu, char *devstr,
+				       char *s)
 {
 	puts("NAND support not available!\n");
 	return -1;
@@ -166,9 +169,10 @@ static inline int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
 #endif
 
 #ifdef CONFIG_DFU_RAM
-extern int dfu_fill_entity_ram(struct dfu_entity *dfu, char *s);
+extern int dfu_fill_entity_ram(struct dfu_entity *dfu, char *devstr, char *s);
 #else
-static inline int dfu_fill_entity_ram(struct dfu_entity *dfu, char *s)
+static inline int dfu_fill_entity_ram(struct dfu_entity *dfu, char *devstr,
+				      char *s)
 {
 	puts("RAM support not available!\n");
 	return -1;
-- 
1.8.1.5

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

end of thread, other threads:[~2015-09-22  7:23 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-06-11 22:03 [U-Boot] [PATCH 1/4] dfu: defer parsing of device string to IO backend Stephen Warren
2014-06-11 22:03 ` [U-Boot] [PATCH 2/4] dfu: allow backend to specify a maximum buffer size Stephen Warren
2014-06-20  7:54   ` Lukasz Majewski
2014-06-11 22:03 ` [U-Boot] [PATCH 3/4] dfu: add free_entity() to struct dfu_entity Stephen Warren
2014-06-20  7:55   ` Lukasz Majewski
2014-06-11 22:03 ` [U-Boot] [PATCH 4/4] dfu: add SF backend Stephen Warren
2014-06-20  7:55   ` Lukasz Majewski
2015-09-21 17:13   ` Fabio Estevam
2015-09-21 17:31     ` Stephen Warren
2015-09-21 17:37       ` Fabio Estevam
2015-09-22  1:50         ` Fabio Estevam
2015-09-22  2:55           ` Fabio Estevam
2015-09-22  3:23             ` Stephen Warren
2015-09-22  3:37               ` Fabio Estevam
2015-09-22  7:23                 ` Lukasz Majewski
2014-06-20  7:54 ` [U-Boot] [PATCH 1/4] dfu: defer parsing of device string to IO backend Lukasz Majewski

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.