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>
This commit is contained in:
Nikita Kiryanov 2015-11-08 17:11:44 +02:00 committed by Tom Rini
parent fd61d39970
commit 4188ba3202

View file

@ -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);