[U-Boot] [PATCH V3 1/2] MMC: unify mmc read and write operation
Anton Staaf
robotboy at google.com
Thu Jun 23 06:10:51 CEST 2011
On Wed, Jun 22, 2011 at 8:03 PM, Lei Wen <leiwen at marvell.com> wrote:
> mmc read and write command has so many in common, unfiy those two to
> force consistency across the those two.
>
> Signed-off-by: Lei Wen <leiwen at marvell.com>
> ---
> Changelog:
> V2:
> unfiy original mmc read and write command together to only place
>
> V3:
> put varible statement at the beginning of function.
>
> common/cmd_mmc.c | 67
> ++++++++++++++++++++++++++++-------------------------
> 1 files changed, 35 insertions(+), 32 deletions(-)
>
> diff --git a/common/cmd_mmc.c b/common/cmd_mmc.c
> index 176646d..a645803 100644
> --- a/common/cmd_mmc.c
> +++ b/common/cmd_mmc.c
> @@ -87,6 +87,11 @@ U_BOOT_CMD(
> );
> #else /* !CONFIG_GENERIC_MMC */
>
> +enum mmc_state {
> + MMC_INVALID,
> + MMC_READ,
> + MMC_WRITE,
> +};
> static void print_mmcinfo(struct mmc *mmc)
> {
> printf("Device: %s\n", mmc->name);
> @@ -144,6 +149,8 @@ U_BOOT_CMD(
>
> int do_mmcops(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
> {
> + enum mmc_state state;
> +
> if (argc < 2)
> return cmd_usage(cmdtp);
>
> @@ -239,53 +246,49 @@ int do_mmcops(cmd_tbl_t *cmdtp, int flag, int argc,
> char * const argv[])
> curr_device, mmc->part_num);
>
> return 0;
> - } else if (strcmp(argv[1], "read") == 0) {
> - void *addr = (void *)simple_strtoul(argv[2], NULL, 16);
> - u32 cnt = simple_strtoul(argv[4], NULL, 16);
> - u32 n;
> - u32 blk = simple_strtoul(argv[3], NULL, 16);
> - struct mmc *mmc = find_mmc_device(curr_device);
> -
> - if (!mmc) {
> - printf("no mmc device at slot %x\n", curr_device);
> - return 1;
> - }
> -
> - printf("\nMMC read: dev # %d, block # %d, count %d ... ",
> - curr_device, blk, cnt);
> -
> - mmc_init(mmc);
> -
> - n = mmc->block_dev.block_read(curr_device, blk, cnt, addr);
> + }
>
> - /* flush cache after read */
> - flush_cache((ulong)addr, cnt * 512); /* FIXME */
> + if (strcmp(argv[1], "read") == 0)
> + state = MMC_READ;
> + else if (strcmp(argv[1], "write") == 0)
> + state = MMC_WRITE;
> + else
> + state = MMC_INVALID;
>
> - printf("%d blocks read: %s\n",
> - n, (n==cnt) ? "OK" : "ERROR");
> - return (n == cnt) ? 0 : 1;
> - } else if (strcmp(argv[1], "write") == 0) {
> + if (state != MMC_INVALID) {
> + struct mmc *mmc = find_mmc_device(curr_device);
> void *addr = (void *)simple_strtoul(argv[2], NULL, 16);
> + u32 blk = simple_strtoul(argv[3], NULL, 16);
> u32 cnt = simple_strtoul(argv[4], NULL, 16);
> u32 n;
> - struct mmc *mmc = find_mmc_device(curr_device);
> -
> - int blk = simple_strtoul(argv[3], NULL, 16);
>
> if (!mmc) {
> printf("no mmc device at slot %x\n", curr_device);
> return 1;
> }
>
> - printf("\nMMC write: dev # %d, block # %d, count %d ... ",
> - curr_device, blk, cnt);
> + printf("\nMMC %s: dev # %d, block # %d, count %d ... ",
> + argv[1], curr_device, blk, cnt);
>
> mmc_init(mmc);
>
> - n = mmc->block_dev.block_write(curr_device, blk, cnt,
> addr);
> + switch (state) {
> + case MMC_READ:
> + n = mmc->block_dev.block_read(curr_device, blk,
> + cnt, addr);
> + /* flush cache after read */
> + flush_cache((ulong)addr, cnt * 512); /* FIXME */
> + break;
> + case MMC_WRITE:
> + n = mmc->block_dev.block_write(curr_device, blk,
> + cnt, addr);
> + break;
> + default:
> + BUG();
> + }
>
> - printf("%d blocks written: %s\n",
> - n, (n == cnt) ? "OK" : "ERROR");
> + printf("%d blocks %s: %s\n",
> + n, argv[1], (n == cnt) ? "OK" : "ERROR");
>
A minor nit, this might read more smoothly if it were: printf("%s of %d
blocks: %s\n", argv[1], n, (n == cnt) ? "OK" : "ERROR"); As in "read of 12
blocks: OK" instead of "12 blocks read: OK"
return (n == cnt) ? 0 : 1;
> }
>
> --
> 1.7.0.4
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
>
More information about the U-Boot
mailing list