diff --git a/cmd/misc.c b/cmd/misc.c
index 39d86835cff76122cc5940f521e5e4e6f2c2b11d..efcbb90d18da2769d7f7c73c6c12e08e8ab8d803 100644
--- a/cmd/misc.c
+++ b/cmd/misc.c
@@ -15,13 +15,31 @@
 static int do_sleep(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
 	ulong start = get_timer(0);
+	ulong mdelay = 0;
 	ulong delay;
+	char *frpart;
 
 	if (argc != 2)
 		return CMD_RET_USAGE;
 
 	delay = simple_strtoul(argv[1], NULL, 10) * CONFIG_SYS_HZ;
 
+	frpart = strchr(argv[1], '.');
+
+	if (frpart) {
+		uint mult = CONFIG_SYS_HZ / 10;
+		for (frpart++; *frpart != '\0' && mult > 0; frpart++) {
+			if (*frpart < '0' || *frpart > '9') {
+				mdelay = 0;
+				break;
+			}
+			mdelay += (*frpart - '0') * mult;
+			mult /= 10;
+		}
+	}
+
+	delay += mdelay;
+
 	while (get_timer(start) < delay) {
 		if (ctrlc())
 			return (-1);
@@ -36,7 +54,8 @@ U_BOOT_CMD(
 	sleep ,    2,    1,     do_sleep,
 	"delay execution for some time",
 	"N\n"
-	"    - delay execution for N seconds (N is _decimal_ !!!)"
+	"    - delay execution for N seconds (N is _decimal_ and can be\n"
+	"      fractional)"
 );
 
 #ifdef CONFIG_CMD_TIMER