diff --git a/common/Kconfig b/common/Kconfig
index 21e067c8582035fa96899eaa868a791479f0ef5c..dcab69d3215a05f5919d1bf65dd16ba3ced8964a 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -504,6 +504,19 @@ config LOG_TEST
 	  in various different ways to test that the logging system works
 	  correctly with varoius settings.
 
+config LOG_ERROR_RETURN
+	bool "Log all functions which return an error"
+	depends on LOG
+	help
+	  When an error is returned in U-Boot it is sometimes difficult to
+	  figure out the root cause. For eaxmple, reading from SPI flash may
+	  fail due to a problem in the SPI controller or due to the flash part
+	  not returning the expected information. This option changes
+	  log_ret() to log any errors it sees. With this option disabled,
+	  log_ret() is a nop.
+
+	  You can add log_ret() to all functions which return an error code.
+
 endmenu
 
 config DEFAULT_FDT_FILE
diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig
index 7efb4ebf117b07e3e62526ae3bc9ce7b0fee68f2..41a2e34235dd02d1ba52a15ebd106b9eef5383d1 100644
--- a/configs/sandbox_defconfig
+++ b/configs/sandbox_defconfig
@@ -18,6 +18,7 @@ CONFIG_PRE_CONSOLE_BUFFER=y
 CONFIG_PRE_CON_BUF_ADDR=0x100000
 CONFIG_LOG=y
 CONFIG_LOG_MAX_LEVEL=6
+CONFIG_LOG_ERROR_RETURN=y
 CONFIG_CMD_CPU=y
 CONFIG_CMD_LICENSE=y
 CONFIG_CMD_BOOTZ=y
diff --git a/doc/README.log b/doc/README.log
index 54d9a8e1b90ea4f13418390522c49a6b86ed113d..2abaee0c10d159413eece3398fba08424fde78cd 100644
--- a/doc/README.log
+++ b/doc/README.log
@@ -148,6 +148,14 @@ Also debug() and error() will generate log records  - these use LOG_CATEGORY
 as the category, so you should #define this right at the top of the source
 file to ensure the category is correct.
 
+You can also define CONFIG_LOG_ERROR_RETURN to enable the log_ret() macro. This
+can be used whenever your function returns an error value:
+
+   return log_ret(uclass_first_device(UCLASS_MMC, &dev));
+
+This will write a log record when an error code is detected (a value < 0). This
+can make it easier to trace errors that are generated deep in the call stack.
+
 
 Code size
 ---------
diff --git a/include/log.h b/include/log.h
index 828919a409f470b95c6ce9b55fcba47e8c4e5535..68368d5cf1db5c46d99e455e9dff321e387b9759 100644
--- a/include/log.h
+++ b/include/log.h
@@ -159,6 +159,17 @@ void __assert_fail(const char *assertion, const char *file, unsigned int line,
 	({ if (!(x) && _DEBUG) \
 		__assert_fail(#x, __FILE__, __LINE__, __func__); })
 
+#ifdef CONFIG_LOG_ERROR_RETURN
+#define log_ret(_ret) ({ \
+	int __ret = (_ret); \
+	if (__ret < 0) \
+		log(LOG_CATEGORY, LOGL_ERR, "returning err=%d\n", __ret); \
+	__ret; \
+	})
+#else
+#define log_ret(_ret) (_ret)
+#endif
+
 /**
  * struct log_rec - a single log record
  *