summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Kiryanov <nikita@compulab.co.il>2015-11-08 15:11:44 (GMT)
committerTom Rini <trini@konsulko.com>2015-11-18 19:50:00 (GMT)
commit4188ba3202172863d6034adfcac805e8bccf186a (patch)
tree0df52ad83243d28cd089069dae59eea096ca0400
parentfd61d39970b9901217efc7536d9f3a61b4e1752a (diff)
downloadu-boot-fsl-qoriq-4188ba3202172863d6034adfcac805e8bccf186a.tar.xz
spl: mmc: refactor device location code to its own function
Simplify spl_mmc_load_image() code by moving the part that finds the mmc device into its own function spl_mmc_find_device(), available in two flavors: DM and non-DM. This refactor fixes a bug in which an error in the device location sequence does not necessarily aborts the rest of the code. With this refactor, we fail the moment there is an error. Signed-off-by: Nikita Kiryanov <nikita@compulab.co.il> Cc: Igor Grinberg <grinberg@compulab.co.il> Cc: Paul Kocialkowski <contact@paulk.fr> Cc: Pantelis Antoniou <panto@antoniou-consulting.com> Cc: Tom Rini <trini@konsulko.com> Cc: Simon Glass <sjg@chromium.org> Reviewed-by: Simon Glass <sjg@chromium.org> Reviewed-by: Tom Rini <trini@konsulko.com>
-rw-r--r--common/spl/spl_mmc.c77
1 files changed, 55 insertions, 22 deletions
diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
index 6011f77..9d3c09e 100644
--- a/common/spl/spl_mmc.c
+++ b/common/spl/spl_mmc.c
@@ -11,6 +11,7 @@
#include <spl.h>
#include <linux/compiler.h>
#include <asm/u-boot.h>
+#include <errno.h>
#include <mmc.h>
#include <image.h>
@@ -59,6 +60,58 @@ end:
return 0;
}
+#ifdef CONFIG_DM_MMC
+static int spl_mmc_find_device(struct mmc **mmc)
+{
+ struct udevice *dev;
+ int err;
+
+ err = mmc_initialize(NULL);
+ if (err) {
+#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
+ printf("spl: could not initialize mmc. error: %d\n", err);
+#endif
+ return err;
+ }
+
+ err = uclass_get_device(UCLASS_MMC, 0, &dev);
+ if (err) {
+#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
+ printf("spl: could not find mmc device. error: %d\n", err);
+#endif
+ return err;
+ }
+
+ *mmc = NULL;
+ *mmc = mmc_get_mmc_dev(dev);
+ return *mmc != NULL ? 0 : -ENODEV;
+}
+#else
+static int spl_mmc_find_device(struct mmc **mmc)
+{
+ int err;
+
+ err = mmc_initialize(gd->bd);
+ if (err) {
+#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
+ printf("spl: could not initialize mmc. error: %d\n", err);
+#endif
+ return err;
+ }
+
+ /* We register only one device. So, the dev id is always 0 */
+ *mmc = find_mmc_device(0);
+ if (!*mmc) {
+#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
+ puts("spl: mmc device not found\n");
+#endif
+ return -ENODEV;
+ }
+
+ return 0;
+}
+#endif
+
#ifdef CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_PARTITION
static int mmc_load_image_raw_partition(struct mmc *mmc, int partition)
{
@@ -110,30 +163,10 @@ void spl_mmc_load_image(void)
int err = 0;
__maybe_unused int part;
-#ifdef CONFIG_DM_MMC
- struct udevice *dev;
-
- mmc_initialize(NULL);
- err = uclass_get_device(UCLASS_MMC, 0, &dev);
- mmc = NULL;
- if (!err)
- mmc = mmc_get_mmc_dev(dev);
-#else
- mmc_initialize(gd->bd);
-
- /* We register only one device. So, the dev id is always 0 */
- mmc = find_mmc_device(0);
- if (!mmc) {
-#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
- puts("spl: mmc device not found\n");
-#endif
+ if (spl_mmc_find_device(&mmc))
hang();
- }
-#endif
-
- if (!err)
- err = mmc_init(mmc);
+ err = mmc_init(mmc);
if (err) {
#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
printf("spl: mmc init failed with error: %d\n", err);